求字符串最长连续不重复的字串
2015-12-23 23:30
621 查看
思路: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-8 const int inf = 0x3f3f3f3f, N = 1e3 + 5, MOD = 1e9 + 7; int T, cas = 0; int n, m; int dp[105]; char s ; #define LOCAL int 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; }
相关文章推荐
- 预算oracle
- linux学习书籍和路线推荐
- Android 2D 绘图
- scala语法 基础3
- iOS图文混排的简易实现
- 如果看了此文你还不懂傅里叶变换,那就过来掐死我吧【完整版】(转)
- Android中SQLite应用详解
- sharedPrefereces
- Tableview 默认选中第一行以及选中背景自定义
- Eclipse使用技巧
- Xcode常用快捷键
- 关于基于ARM cortex-r5的Marvell1093r2主控的IPC通信心得
- 搭建基于MyEclipse的Hadoop开发环境
- MVVM双向绑定实现之Object.defineProperty
- B/S架构与C/S架构
- Java [Leetcode 242]Valid Anagram
- 显示有限的接口到外部
- SQL Server,MySQL,Oracle三者的区别
- Matlab 之meshgrid, interp, griddata 用法和实例
- OnGlobalLayoutListener获得一个视图的高度