
2025-11-08:不相交子字符串的最大数量。用go语言,给定字符串 word,求最多能从中取出多少个互不重叠的连续片段(即子串),要求每个片段长度不少于 4 且第一个字符和最后一个字符相同。返回这个最大数量。
1 <= word.length <= 200000。
word 仅由小写英文字母组成。
输入: word = "abcdeafdef"。
输出: 2。
解释:
两个子字符串是 "abcdea" 和 "fdef"。
题目来自力扣3557。
该算法使用贪心策略和位运算优化来高效解决问题。以下是详细的分步过程:
ans变量统计有效子串数量,初始为0。seen变量作为位掩码(32位整数),初始为0,用于记录最近出现过的字符(小写字母映射到0-25位)。i = 3开始遍历字符串(因为子串长度至少为4,需检查word[i-3]到word[i]的范围)。i(从第4个字符开始):word[i-3]对应的位设为1(seen |= 1 << (word[i-3] - 'a'))。这一步记录当前窗口前第3个字符的出现状态。word[i]是否在seen中出现过(seen >> (word[i] - 'a') & 1 > 0)。若为真,说明存在以word[i]结尾且长度≥4的子串,其首尾字符相同。i=5时,若word[5]与之前某个word[j](j≤2)相同,则子串word[j:5+1]满足条件。ans加1。seen为0,清空历史字符记录。i增加3(i += 3),确保下一个子串不会与当前子串重叠。跳跃后,循环本身的i++会使下一次检查从i+4开始,避免重复利用字符。ans作为最大不相交子串数量。word = "abcdeafdef":"abcdea"(首尾'a'相同)后计数为1,跳过中间字符。"fdef"(首尾'f'相同)后计数为2。ans, seen, i),与输入规模无关。seen的比特位替代哈希表,快速查询字符出现历史。i += 3避免重叠,减少冗余检查。此算法高效利用了问题约束(字符集小、子串长度固定),实现了线性时间与常数空间的最优解。
.
package main
import (
"fmt"
)
func maxSubstrings(word string) (ans int) {
seen := 0
for i := 3; i < len(word); i++ {
seen |= 1 << (word[i-3] - 'a')
if seen>>(word[i]-'a')&1 > 0 { // 再次遇到 word[i]
ans++
seen = 0
i += 3
}
}
return
}
func main() {
word := "abcdeafdef"
result := maxSubstrings(word)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def max_substrings(word: str) -> int:
ans = 0
seen = 0
i = 3
while i < len(word):
# 将前3个位置的字符记录到seen中
seen |= 1 << (ord(word[i - 3]) - ord('a'))
# 检查当前字符是否在seen中出现过
if (seen >> (ord(word[i]) - ord('a'))) & 1 > 0:
ans += 1
seen = 0
i += 3 # 跳过3个字符
i += 1
return ans
# 测试代码
if __name__ == "__main__":
word = "abcdeafdef"
result = max_substrings(word)
print(result)
.
#include <iostream>
#include <string>
using namespace std;
int maxSubstrings(string word) {
int ans = 0;
int seen = 0;
for (int i = 3; i < word.length(); i++) {
seen |= 1 << (word[i - 3] - 'a');
if ((seen >> (word[i] - 'a')) & 1) { // 再次遇到 word[i]
ans++;
seen = 0;
i += 3;
}
}
return ans;
}
int main() {
string word = "abcdeafdef";
int result = maxSubstrings(word);
cout << result << endl;
return0;
}
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。