题解
2024-12-16 22:46:16
发布于:广东
30阅读
0回复
0点赞
我们可以用一种新型的记录方法,也可以记录到所有的子串.
例如 :
遍历到第 个字符,:将 加入字符串,并增加 个子串: .
遍历到第 个字符,:将 加入字符串,并增加 个子串:.
遍历到第 个字符,:将 加入字符串,并增加 个子串:.
遍历到第 个字符,:由于已经出现过了 ,所以第 个字符就不能要了,令 . 此时可新增 个子串:.
遍历到第 个字符,:将 加入字符串,并增加 个子串:.
遍历到第 个字符,:由于已经出现过了 ,所以第 个字符就不能要了,令 . 此时可新增 个子串:.
遍历到第 个字符,:将 加入字符串,并增加 个子串:.
共有 个不含有重复字符的子串.
翻译成代码如下:
#include <iostream>
#include <cstdio>
#include <set>
#define int long long
using namespace std;
int a[100005];
set <char> vis;//当时赶时间,用了set,如果用bool数组可以降到严格O(n)
signed main(){
cin.tie(nullptr) -> sync_with_stdio(0);
cout.tie(nullptr) -> sync_with_stdio(0);
string s;
cin >> s;
int ct = 0, l = 0;
for(int i = 0; i < s.length(); i++){
while(vis.find(s[i]) != vis.end()){//找到重复元素
vis.erase(s[l++]);//前面的字符不能要了
}
vis.insert(s[i]);
ct += i - l + 1;//加入这些状态
}
cout << ct;
return 0;
}
时间复杂度:
这里空空如也
有帮助,赞一个