如果一个字符串不含有任何重复字符,我们称这个字符串为 好 字符串。
给你一个字符串 s
,请你返回 s
中长度为 3 的 好子字符串 的数量。
注意,如果相同的好子字符串出现多次,每一次都应该被记入答案之中。
子字符串 是一个字符串中连续的字符序列。
示例 1:
输入:s = "xyzzaz" 输出:1 解释:总共有 4 个长度为 3 的子字符串:"xyz","yzz","zza" 和 "zaz" 。 唯一的长度为 3 的好子字符串是 "xyz" 。
示例 2:
输入:s = "aababcabc" 输出:4 解释:总共有 7 个长度为 3 的子字符串:"aab","aba","bab","abc","bca","cab" 和 "abc" 。 好子字符串包括 "abc","bca","cab" 和 "abc" 。
提示:
1 <= s.length <= 100
s
只包含小写英文字母。
Related Topics
题解
public int countGoodSubstrings(String s) {
int count = 0;
for (int i = 0; i < s.length()-2; i++) {
if (s.charAt(i)!=s.charAt(i+1) && s.charAt(i+1)!= s.charAt(i+2) && s.charAt(i)!=s.charAt(i+2)){
count++;
}
}
return count;
}
稍微改一下下,本次的第二第三个字符的对比结果,在下一次作为第一第二个字符的对比结果
public int countGoodSubstrings(String s) {
if (s.length() < 3){
return 0;
}
int count = 0;
boolean firstEqualSecond = s.charAt(0)!=s.charAt(1);
for (int i = 0; i < s.length()-2; i++) {
boolean secondEqualThird = s.charAt(i+1)!= s.charAt(i+2);
if (firstEqualSecond && secondEqualThird && s.charAt(i)!=s.charAt(i+2)){
count++;
}
firstEqualSecond = secondEqualThird;
}
return count;
}
顺便再改下
public int countGoodSubstrings(String s) {
if (s.length() < 3){
return 0;
}
int count = 0;
boolean firstEqualSecond = s.charAt(0)!=s.charAt(1);
for (int i = 0; i < s.length()-2; i++) {
boolean secondEqualThird = s.charAt(i+1)!= s.charAt(i+2);
if (!secondEqualThird){
//如果第二第三个字符相同,那么下一轮也是不用比较的,直接进入下下轮
i++;
//但是firstEqualSecond缓存的值就失效了,需要重新算下
//又但是下下轮可能越界
//所以,下面的i+1是下下轮的第一位
if (i+1+2< s.length()){
firstEqualSecond = s.charAt(i+1)!=s.charAt(i+2);
}
continue;
}
if (firstEqualSecond && secondEqualThird && s.charAt(i)!=s.charAt(i+2)){
count++;
}
firstEqualSecond = secondEqualThird;
}
return count;
}
不过性能好像没啥提升
发表评论