使用HashSet的字符串的最长子串的长度

时间:2018-02-08 15:10:45

标签: java string collections set hashset

我有最长子串长度的代码,但我不确定" else"以下代码的一部分。 此外,变量从这里开始表示??

while(start < i && s.charAt(start)!=c){
                set.remove(s.charAt(start));
                start++;
            }
            start++;

完整的方法代码:

public static int lengthOfLongestSubstring(String s) {
    if(s==null || s.length()==0)
        return 0;

    HashSet<Character> set = new HashSet<Character>();

    int max=0;

    int i=0;
    int start=0;
    while(i < s.length()){
        char c = s.charAt(i);
        if(!set.contains(c)){
            set.add(c);
        }else{
            max = Math.max(max, set.size());

            while(start < i && s.charAt(start)!=c){
                set.remove(s.charAt(start));
                start++;
            }
            start++;
        }

        i++;
    } 

    max = Math.max(max, set.size());

    return max;
}

1 个答案:

答案 0 :(得分:1)

问题要求子字符串中每个字符唯一的最长子字符串。这个问题要求描述else块的作用,以及描述start。要进行描述,请考虑字符串 abcdbfg

start = 0; //指向唯一子字符串

中第一个字符的指针
  1. 构建该集,直到有重复的字母。当你到达abcdb时会发生这种情况。此时,该集合包含'a','b','c','d'。 (最大长度= 4)。

  2. 此时,您需要记录max(4),并将'start'指针移过第一个重复的字母('b')。你这样做是因为剩下的是一个独特子串的新可能性。在此期间,您将删除前导字符'a','b'。该集合现在将包含'b','c','d'和'c'的起点。

  3. 您继续构建'c','d','b',直到找到另一个重复的字母,然后重复直到字符串完成。在此示例中,字符串继续为'cdbfg',答案为5。