最大无重复字母子串
2015-11-01 22:12
197 查看
一、题目
对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。
测试样例:
“aabcb”,5返回:3
二、解题思路
设立一个hash表记录每个字母前一次出现的坐标;设立一个pre数组记录字符串到该字母为止,包含该字母可以取得的最大不重复字符串。
例:
标号i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
字母A[i] | a | c | a | b | d | e | b | c |
i=1: c新出现,位置为1,包含此c的最大不重复字母子串为ac,长度为2;
i=2: a已经出现过了,要获得包含此a的串必须考虑包含前一位(c)的最大字符串是否包含前一个a;ac包含前一个a,所以最大不重复字母子串为ca,长度为2,更新a的位置为2;
i=3: b新出现,位置为3,包含此b的最大不重复字母子串为cab,长度为3;
i=4: d新出现,位置为4,包含此d的最大不重复字母子串为cabd,长度为4;
i=5: e新出现,位置为5,包含此e的最大不重复字母子串为cabde,长度为5;
i=6: b已经出现过了,要获得包含此b的串必须考虑包含前一位(e)的最大字符串是否包含前一个b;cabde包含前一个b,所以最大不重复字母子串为edb,长度为3,更新b的位置为6;
i=7: c已经出现过了,要获得包含此c的串必须考虑包含前一位(b)的最大字符串是否包含前一个c;edb不包含前一个c,所以最大不重复字母子串为edbc,长度为4,更新c的位置为7;
因此比较生成的最大不重复字母子串 a ac ca cab cabd cabde edb edbc 最大的子串为cabde 长度为5.
三、代码实现
class DistinctSubstring { public: int longestSubstring(string A, int n) { int hash[26];//26个字母 memset(hash, -1, sizeof(hash));//所有字母hash表值初始为-1 int *pre = new int ;//动态数组 int maxlengthsbustring = 0; pre[0] = 1; hash[A[0] - 'a'] = 0; //第一个字母的hash表值为它的位置0 for (int i = 1; i < n; i++){ if (hash[A[i] - 'a'] == -1){//新字母 pre[i] = pre[i - 1] + 1; } else{//前面已有的字母x if (hash[A[i] - 'a'] >= i - pre[i - 1]){//相同字母存在于前一个pre串中 pre[i] = i - hash[A[i] - 'a']; } else{ pre[i] = pre[i - 1] + 1; } } hash[A[i] - 'a'] = i; if (pre[i] > maxlengthsbustring) maxlengthsbustring = pre[i]; } delete pre; return maxlengthsbustring; } };
相关文章推荐
- 数据库链接字符串查询网站
- Flex字符串比较 还有Flex字符串操作
- Ruby中创建字符串的一些技巧小结
- ASP下经常用的字符串等函数参考资料
- 将字符串小写转大写并延时输出的批处理代码
- 将字符串转换成System.Drawing.Color类型的方法
- Lua源码中字符串类型的实现
- Lua性能优化技巧(四):关于字符串
- 字符串聚合函数(去除重复值)
- Ruby中的字符串编写示例
- 总结的5个C#字符串操作方法分享
- sqlserver中求字符串中汉字的个数的sql语句
- sql server字符串非空判断实现方法
- VBS的字符串及日期操作相关函数
- C#实现将千分位字符串转换成数字的方法
- jquery 删除字符串最后一个字符的方法解析
- PowerShell实现在字符串中查找大写字母
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- PowerShell中字符串使用单引号和双引号的区别
- Powershell小技巧之获取字符串的行数