最长无重复字符串/Java/
来源:互联网 发布:linux 启动oracle实例 编辑:程序博客网 时间:2024/06/05 22:35
题目要求:
给定一个字符串,请找出其中无重复字符的最长子字符串。
样例
例如,在"abcabcbb"
中,其无重复字符的最长子字符串是"abc"
,其长度为 3
。
对于,"bbbbb"
,其无重复字符的最长子字符串为"b"
,长度为1
。
挑战
O(n) 时间
原题地址:
LeetCode:https://leetcode.com/problems/longest-substring-without-repeating-characters/#/description
LintCode:http://www.lintcode.com/zh-cn/problem/longest-substring-without-repeating-characters/#
分析:
我第一次做这题的时候,是用一种最普通的做法——遍历两次,穷举所有的字符串,找出不重复字符串,存其长度。最后返回长度的最大值。
但是这样做的问题是时间复杂度为O(n^2),和题目要求不符,所以在LeetCode和Lintcode上的提交都扑街了。然后意识到应该采用HashMap,但一时也拿不出确切的方法,于是搜索了一下本题做法。
现在就在这篇博客贴一下两种做法吧:
做法一(时间复杂度O(n^2)):
public int lengthOfLongestSubstring(String s) { String res = "";int temp = 0;ArrayList<Integer> list = new ArrayList<Integer>();if (s == null || s.length() == 0) {} else if (s.length() == 1) {temp = 1;} else {int i = 0;while (i < s.length() - 1) {int j = 1;while (j <= s.length() - i) {if (isRepetitive(s.substring(i, i + j))) {res = s.substring(i, i + j);temp = Math.max(temp, res.length());}else{break;}j++;}i++;}}return temp;}
// 判断字符串是否有重复字符public static boolean isRepetitive(String s) {boolean b = true;if (s.length() > 1) {for (int i = 1; i < s.length(); i++) {if (s.substring(0, i).contains(s.substring(i, i + 1))) {b = false;break;}}}return b;}
做法二(时间复杂度为O(n)):
public int lengthOfLongestSubstring(String s) {int temp = 0;if (s == null || s.length() == 0) {} else {Map<Character, Integer> myMap = new HashMap<Character, Integer>();// 用以保存不重复字符串的长度int[] strlength = new int[s.length() + 1];// 用字符数组表示字符串char[] str = s.toCharArray();for (int i = 0; i < str.length; i++) {Integer lastPosOfChar = myMap.get(str[i]);if (lastPosOfChar == null) {// 更新最长无重复子串的长度strlength[i] = i == 0 ? 1 : strlength[i - 1] + 1;// 果map添加该字符和位置myMap.put(str[i], i);} else {int aPos = lastPosOfChar + 1;int unRepeatLen = strlength[i - 1];int bPos = i - unRepeatLen;if (aPos >= bPos) {// 当前位置的最长无重复子串长度strlength[i] = i - aPos + 1;} else {// 当前位置的最长无重复子串长度strlength[i] = i - bPos + 1;}// 跟新当前字符出现的位置myMap.put(str[i], i);}}for (int i : strlength) {temp = Math.max(temp, i);}}return temp;}
总结:Map大法好,应当努力学习一个。
阅读全文
1 0
- 最长无重复字符串/Java/
- 最长无重复字符串
- 最长无重复子字符串
- 最长子字符串-无重复字符
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 查找字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串的最长无重复字符子串(C++)
- 求字符串中最长无重复字符的子串
- 字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 求字符串中最长无重复字符的子串
- 找到字符串的最长无重复字符子串
- 字符串12:最长无重复字符子串练习题
- leetcode 3-最长无重复字符的子字符串
- 字符串——最长无重复子串
- Android之ViewFlipper的简单使用
- JS获取JSON对象中的KEY和VALUE
- error C2381: “exit” : 重定义;__declspec(noreturn) 不同
- 旋转变换(二)欧拉角
- 汇编语言——第十三章(int 中断)
- 最长无重复字符串/Java/
- iOS GitHub上常用第三方框架与一些参考文本总结
- 位运算
- 二维显存的使用
- iOS/Android 浏览器(h5)及微信中唤起本地APP
- am3352 wince gt ft触摸屏驱动
- FVFD
- 二叉树的创建和递归遍历
- 质数因子