某大厂HR准备裁一个36岁的程序员,找他谈话的时候,得知他刚离婚被出轨,孩子可能还不是亲生的。突然意思到他毫无软肋,有可能做出极端事件,为防止意外发生,于是决定不裁他了,把一个刚结婚准备要小孩的女员工裁掉。
对于这个行为很多网友是非常支持的,给出的理由是不可把人给逼到绝路。确实,都已经那么惨了,没必要在雪上加霜,不过那个被裁的女员工就很不幸了。
--------------下面是今天的算法题--------------
来看下今天的算法题,这题是LeetCode的第1332题,删除回文子序列,难度是简单。
给你一个字符串 s,它仅由字母 'a' 和 'b' 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。返回删除给定字符串中所有字符(字符串为空)的最小删除次数。
「子序列」定义:如果一个字符串可以通过删除原字符串某些字符而不改变原字符顺序得到,那么这个字符串就是原字符串的一个子序列。
「回文」定义:如果一个字符串向后和向前读是一致的,那么这个字符串就是一个回文。
示例1:
输入:s = "ababa" 输出:1 解释:字符串本身就是回文序列,只需要删除一次。
示例2:
输入:s = "baabb" 输出:2 解释:"baabb" -> "b" -> "". 先删除回文子序列 "baab",然后再删除 "b"。
1 <= s.length <= 1000
s 仅包含字母 'a' 和 'b'
问题分析
这题说的是每次从字符串中删除一个回文子序列,问最少需要多少次可以把字符串全部删除完,字符串中只包含字符 a 和 b 。
因为相同的字符构成的字符串一定是回文串,所以只包含 a 和 b 的字符串至少有两个回文子序列,所以无论怎么排列,我们最少可以删除 2 次。但是如果给定的字符串本来就是回文的,我们可以全部一次性删除,只需要删除一次即可。
所以这里我们判断给定的字符串是否是回文的,如果是回文的,删除 1 次,否则删除 2 次。
JAVA:
public int removePalindromeSub(String s) { int n = s.length(); for (int i = 0; i < n / 2; ++i) { if (s.charAt(i) != s.charAt(n - 1 - i)) return 2;// 如果不是回文串,返回 2 。 } return 1;// 如果是回文串,返回 1 。 }C++:
public: int removePalindromeSub(string s) { int n = s.length(); for (int i = 0; i < n / 2; ++i) { if (s[i] != s[n - 1 - i]) return 2;// 如果不是回文串,返回 2 。 } return 1;// 如果是回文串,返回 1 。 }笔者简介
博哥,真名:王一博,毕业十多年, 作者,专注于 数据结构和算法 的讲解,在全球30多个算法网站中累计做题2000多道,在公众号中写算法题解900多题,对算法题有自己独特的解题思路和解题技巧。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.