Leetcode——长度为 3 的不同回文子序列
Posted Yawn,
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode——长度为 3 的不同回文子序列相关的知识,希望对你有一定的参考价值。
1. 题目
给你一个字符串 s ,返回 s 中 长度为 3 的不同回文子序列 的个数。
即便存在多种方法来构建相同的子序列,但相同的子序列只计数一次。
回文 是正着读和反着读一样的字符串。
子序列 是由原字符串删除其中部分字符(也可以不删除)且不改变剩余字符之间相对顺序形成的一个新字符串。
例如,“ace” 是 “abcde” 的一个子序列。
2. 题解
解法一:
因为题目要求的回文子字符串的长度为3,所以我们只需要判断第1个字符和第3个字符是否相等,再找出两个字符中间有多少个不同字符,就是对应的回文子字符串的个数:
class Solution {
public int countPalindromicSubsequence(String s) {
int n = s.length(), ans = 0;
char[] sc = s.toCharArray();
for (int i=0; i<26; i++) { //遍历26个字母,找出回文个数
char t = (char)(i+'a');
int left = n;
for (int j=0; j<n; j++) { //找第一个字符
if (sc[j]==t) {
left = j;
break;
}
}
int right = -1;
for (int j=n-1; j>=0; j--) { //找第三个字符,和第一个相等
if (sc[j]==t) {
right = j;
break;
}
}
Set<Character> aux = new HashSet<>();
for (int j=left+1; j<right; j++) { //判断两个相同字符中间有多少个不同的字符,计数即可
aux.add(sc[j]);
}
ans += aux.size();
}
return ans;
}
}
解法二:
思路与解法一一致,使用set跟map
class Solution {
public int countPalindromicSubsequence(String s) {
int len = s.length();
int count = 0;
Map<Character, Integer> map = new HashMap<>();
Set<Character> seen = new HashSet<>();
for (int i = 0; i < len; i++) {
map.put(s.charAt(i), i);
}
for (int i = 0; i < len - 2; i++) {
if (seen.contains(s.charAt(i))) continue;
Set<Character> set = new HashSet<>();
int end = map.get(s.charAt(i));
for (int j = i + 1; j < end; j++) {
set.add(s.charAt(j));
}
count += set.size();
seen.add(s.charAt(i));
}
return count;
}
}
以上是关于Leetcode——长度为 3 的不同回文子序列的主要内容,如果未能解决你的问题,请参考以下文章