leetCode Q3:Longest Substring Without Repeating Characters(java)

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%的人)

猜你喜欢

转载自blog.csdn.net/c_little_white/article/details/78320687