求字符串最长连续不重复的字串

来源:互联网 发布:淘宝店铺花钱解冻 编辑:程序博客网 时间:2024/06/04 17:49

思路:dp[c]记录字符c上一次出现的位置。l记录上一个连续不重复字串的左边界,这样就可以更新连续不重复子串的长度。我这里输出的是第一次出现的最长的连续不重复子串。

#include <algorithm>#include <iostream>#include <sstream>#include <cstring>#include <cstdio>#include <vector>#include <string>#include <queue>#include <stack>#include <cmath>#include <set>#include <map>using namespace std;typedef long long LL;#define mem(a, n) memset(a, n, sizeof(a))#define ALL(v) v.begin(), v.end()#define si(a) scanf("%d", &a)#define sii(a, b) scanf("%d%d", &a, &b)#define siii(a, b, c) scanf("%d%d%d", &a, &b, &c)#define pb push_back#define eps 1e-8const int inf = 0x3f3f3f3f, N = 1e3 + 5, MOD = 1e9 + 7;int T, cas = 0;int n, m;int dp[105];char s[N];#define LOCALint main(){#ifdef LOCAL    freopen("/Users/apple/input.txt", "r", stdin);//    freopen("/Users/apple/out.txt", "w", stdout);#endif        while(scanf("%s", s) != EOF) {        int len = strlen(s);        mem(dp, -1);        int ul = -1, ur = -1, l = -1, ans = 0;        for(int r = 0; r < len; r ++) {            int index = dp[s[r]] + 1;            dp[s[r]] = r;            l = max(l, index);            if(r - l + 1 > ans) {                ans = r - l + 1;                ul = l, ur = r;            }        }        printf("[%d, %d]\n", ul, ur);        for(int i = ul; i <= ur; i ++) putchar(s[i]); puts("");    }        return 0;}


0 0