LeetCode 3456.找出长度为K的特殊子字符串
给你一个字符串 s 和一个整数 k。
判断是否存在一个长度 恰好 为 k 的子字符串,该子字符串需要满足以下条件:
该子字符串 只包含一个唯一字符(例如,“aaa” 或 “bbb”)。
如果该子字符串的 前面 有字符,则该字符必须与子字符串中的字符不同。
如果该子字符串的 后面 有字符,则该字符也必须与子字符串中的字符不同。
如果存在这样的子串,返回 true;否则,返回 false。
子字符串 是字符串中的连续、非空字符序列。
示例 1:
输入: s = “aaabaaa”, k = 3
输出: true
解释:
子字符串 s[4…6] == “aaa” 满足条件:
长度为 3。
所有字符相同。
子串 “aaa” 前的字符是 ‘b’,与 ‘a’ 不同。
子串 “aaa” 后没有字符。
示例 2:
输入: s = “abc”, k = 2
输出: false
解释:
不存在长度为 2 、仅由一个唯一字符组成且满足所有条件的子字符串。
提示:
1 <= k <= s.length <= 100
s 仅由小写英文字母组成。
分组循环,看连续的那组子字符串是否符合要求:
class Solution {
public:bool hasSpecialSubstring(string s, int k) {int n = s.size();int i = 0;while (i < n) {// 保证该组字符串前面没有相同字符if (i > 0 && s[i] == s[i - 1]) {++i;continue;}// 找出该组字符串的结束位置int start = i;while (i == start || i < n && i - start < k && s[i] == s[i - 1]) {++i;}// 如果该组字符串长度为k,且后面一个位置的字符不是该组字符if (i - start == k && (i == n || s[i] != s[start])) {return true;}}return false;}
};
如果s的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。