LeetCode: 3_Longest Substring Without Repeating Characters | 求没有重复字符的最长子串的长度 | Medium
2015-12-27 10:50
791 查看
题目:
解题思路:
这个题让找一个字符串中具有不重复单词的最长子串的长度,如:ababc,子串为abc,长度为3。有这么几个方法:
方法一:
依赖字符串本身的一些特有函数,进行相应操作来完成。我们可以维护一个子串,来保存最长的无重复的子串,并记录当前子串的长度,如果遇到重复的字符,则去掉子串中重复的字符,一次进行下去,最终就能找到最长无重复子串。如str = ababc, substr = a, ab, ba, ab, abc....类似这样的思路。如下代码:
方法二:
指针法:用一个指针指向字符串的左边界,如果遇到重复的字符,就往后移动,同时用一个有26位的字符数组(因为总共就26个字符)来保存每一个字符最近一次出现的位置,以此来更新指针位置和字符位置之间的距离,就可以算出最长无重复字符的长度,如下代码所示:
方法三:
hashtable法:该方法和方法二其实是同一个思路,只不过该方法我不用数组来存字符的位置,而是通过hashtable来存,进而提高效率。如下代码:
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
解题思路:
这个题让找一个字符串中具有不重复单词的最长子串的长度,如:ababc,子串为abc,长度为3。有这么几个方法:
方法一:
依赖字符串本身的一些特有函数,进行相应操作来完成。我们可以维护一个子串,来保存最长的无重复的子串,并记录当前子串的长度,如果遇到重复的字符,则去掉子串中重复的字符,一次进行下去,最终就能找到最长无重复子串。如str = ababc, substr = a, ab, ba, ab, abc....类似这样的思路。如下代码:
//方法一:string only int lengthOfLongestSubstring(string s) { size_t j = 1; if (s.size() <= 1) return s.size(); int len = 1, nMaxLen = 0; string subStr; subStr.push_back(s[0]); while (j < s.size()) { if (subStr.find(s[j]) == string::npos) { subStr.push_back(s[j]); } else { if (len > nMaxLen) nMaxLen = len; while (subStr.find(s[j]) != string::npos) { subStr.erase(0,1); len --; } subStr.push_back(s[j]); } len ++; j ++; } if (len > nMaxLen) nMaxLen = len; return nMaxLen; }
方法二:
指针法:用一个指针指向字符串的左边界,如果遇到重复的字符,就往后移动,同时用一个有26位的字符数组(因为总共就26个字符)来保存每一个字符最近一次出现的位置,以此来更新指针位置和字符位置之间的距离,就可以算出最长无重复字符的长度,如下代码所示:
//方法二:pointer int lengthOfLongestSubstring2(string s) { int maxlen = 0, left = 0; int sz = s.length(); int prev[26]; memset(prev, -1, sizeof(prev)); for (int i = 0; i < sz; i++) { if (prev[s[i]-'a'] >= left) { left = prev[s[i]-'a'] + 1; } prev[s[i]-'a'] = i; maxlen = max(maxlen, i - left + 1); } return maxlen; }
方法三:
hashtable法:该方法和方法二其实是同一个思路,只不过该方法我不用数组来存字符的位置,而是通过hashtable来存,进而提高效率。如下代码:
//方法三:hash table int lengthOfLongestSubstring3(string s) { if(s.length()<2) return s.length(); int max_len=0; map<char,int> sub; //hash map for(int i=0,j=0;i<s.length();++i){ if(sub.find(s[i])!=sub.end()){ j=max(j,sub[s[i]]+1); } sub[s[i]]=i; max_len=max(max_len,i-j+1); } return max_len; }
相关文章推荐
- 读"解忧杂货铺--深夜的口琴声"有感
- 实习体会
- MyEclipse8.5注册码,到2018年
- Spark大师之路:广播变量(Broadcast)源代码分析
- 含30度锐角的直角三角形中求线段长
- 045_saruman's aramy (区间覆盖问题)POJ 3069
- 简单的学习自定义view
- 杭州(含嘉兴,绍兴,金华,湖州,义乌)Uber优步司机奖励政策(12月21日到12月27日)
- 理解和使用 JavaScript 中的回调函数
- LeetCode - Merge Intervals
- 随机获取Mysql数据表的一条或多条记录
- Theano Multi Layer Perceptron 多层感知机
- 数据结构实验之查找五:平方之哈希表
- linux利用mail发送邮件设置
- 1.STM32F4系列通用定时器TIM2~5总结
- android之左右滑动切换activity
- 数据库设计三大范式
- 关于github的那点事
- SurfaceView 实现高性能的绘制
- 佛山Uber优步司机奖励政策(12月21日到12月27日)