carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode1332:删除回文子序列(remove-palindromic-subsequences) #210

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述

给你一个字符串 s,它仅由字母 'a' 和 'b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。

返回删除给定字符串中所有字符(字符串为空)的最小删除次数。

「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。

「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。

 

示例 1:

输入:s = "ababa" 输出:1 解释:字符串本身就是回文序列,只需要删除一次。

示例 2:

输入:s = "abb" 输出:2 解释:"abb" -> "bb" -> "". 先删除回文子序列 "a",然后再删除 "bb"。

示例 3:

输入:s = "baabb" 输出:2 解释:"baabb" -> "b" -> "". 先删除回文子序列 "baab",然后再删除 "b"。  

提示:

1 <= s.length <= 1000 s 仅包含字母 'a'  和 'b'

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/remove-palindromic-subsequences

carloscn commented 1 year ago

问题分析

先制作一个判断是不是回文串的函数,输入函数为vec切片和长度。如果是回文串 则返回1,不是则返回2

fn is_palin_vec(s_in:&Vec<char>, len:usize) -> bool
{
    if len < 3 {
        return true;
    }

    for i in 0..(len / 2 as usize) {
        if s_in[i] != s_in[len - 1 - i] {
            return false;
        }
    }

    return true;
}

pub fn remove_palindrome_sub(s: String) -> i32
{
    let mut ret:i32 = 0;
    let mut s_vec:Vec<char> = s.chars().collect();

    if is_palin_vec(&s_vec, s_vec.len()) {
        return 1;
    } else {
        return 2;
    }
}
carloscn commented 1 year ago

code

https://review.gerrithub.io/c/carloscn/structstudy/+/553568 https://github.com/carloscn/structstudy/commit/10af9234609f364944a6de2fe2af206718e7d996