leetcode——3. Longest Substring Without Repeating Characters

这道题的目标就是找最长连续无重复子串的长度。

要求:

1、最长子串

2、无重复字符

3、连续

我的解题过程:

第一次,wrong answer 错误代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        int max=0,submax=0,length=s.length();
		int i=0;//指针
		Set set = new HashSet<>();
		while(i 
  

这个思想主要是想要运用集合中元素不重复的性质,每次判断集合中有没有该字符,如果有则从这个字符开始重新向后遍历,并保存之前字串的长度,max保存最长子串,submax保存当前子串的长度。他的错误在于没有考虑周全,错误输入为:"dvdf" 用该算法遍历到第二位‘d’的时候,从该位继续向后计算,没有考虑到最长子串其实是"vdf",因此出现错误。

第二次,accept,代码如下:

class Solution {
    public int lengthOfLongestSubstring(String s) {
       int max=0,submax=0,length=s.length();
		int i=0;//指针
		HashMap map = new HashMap<>();
		while(i

思想是使用哈希表,保存key value,key为字符,value为该字符出现的位置。当第二次出现该字符时,从哈希表中取出上次出现的位置,并将其后面的第一个位置作为再次遍历的位置。这样可以避免上次出现的错误。然后再清空map,让其从新开始存储。可以保证正确性。但是这个代码效率很低,只高于4.16 % 的代码。

第三次,accept 代码如下:

public class Solution {
    public static int lengthOfLongestSubstring(String s) {
        int i = 0, j = 0;
        int max = 0;
        Set set = new HashSet<>();
        while (j < s.length()) {
            if (!set.contains(s.charAt(j))) {
                set.add(s.charAt(j));
                j++;
                if(max

思想:使用set但是用两个指针,i指向子串的头,j指向子串的尾。每次当出现重复时,将set中从i处依次删除子串头部的字符,由于不能保证每次重复的字符都是子串的首字符,所以不能在set中只删除当前重复字符,要从头开始,直到将重复字符从set中删除为止。其实这个过程和我上一次使用哈希表时的思想相似,也是从重复字符的位置开始重新进行遍历。

这一次速度稍微有所提升,但还不算很优。

暂时到这,如果想到更好的算法再更新。

你可能感兴趣的:(算法,java,leetcode)