您的位置:首页 > 编程语言 > Java开发

leetCode Q3:Longest Substring Without Repeating Characters(java)

2017-10-23 17:01 471 查看
1、题目链接:https://leetcode.com/problems/longest-substring-without-repeating-characters/description/

2、题目内容(中文版):

给一个字符串,要求返回最长的不含重复字符的子字符串的长度。

例如:

"abcabcbb",答案是"abc",返回3

"bbbbb",答案是"b", 返回1.

"pwwkew",答案是"wke", 返回3.注意到返回结果必须为子串,如"pwke"不是子字符串。
3、思路:

三次暴力遍历即可。楼主刚开始采用String作为临时存储答案的变量,结果当测试用例为一大串时,就超出时长了(String的字符串拼接+=很浪费时间)。所以用StringBuilder(java的api有写,字符串拼接用StringBuilder比String以及StringBuffer都省时,但是它不是线程安全的),节省了一大部分时间。也Accepted了,就是效率有点低。

4、楼主Accepted的代码:

class Solution {
public int lengthOfLongestSubstring(String s) {
int flag = 0;
int max = 0;
for(int i = 0; i < s.length(); i++) {
StringBuilder cs = new StringBuilder("");
cs.append(s.charAt(i));
for(int j = i+1; j < s.length(); j++) {
flag = 0;
for(int z = 0; z < cs.length(); z++) {
if(cs.charAt(z) == s.charAt(j)) {
flag = 1;
break;
}
}
if(flag == 0) cs.append(s.charAt(j));
else break;
}
if(max < cs.length()) {
max = cs.length();
}
}
return max;
}
}
(时间复杂度:O(n^3),空间复杂度:O(n))
运行结果:



(运行时间:175ms,打败了3.95%的人)

5、leetCode效率高的代码:

public class Solution {
public int lengthOfLongestSubstring(String s) {
int n = s.length(), ans = 0;
int[] index = new int[128]; // current index of character
// try to extend the range [i, j]
for (int j = 0, i = 0; j < n; j++) {
i = Math.max(index[s.charAt(j)], i);
ans = Math.max(ans, j - i + 1);
index[s.charAt(j)] = j + 1;
}
return ans;
}
}
解读:
i:存储重复值的下标。

ans:存储答案的值。

j:给定的字符串s的0~n-1的一次次遍历的下标。

j-i+1:距离重复的字符的不重复值的长度。

(时间复杂度:O(n),空间复杂度:O(n))

运行结果:



(运行时间:52ms,打败了73.64%的人)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: