您的位置:首页 > 其它

3. Longest Substring Without Repeating Characters 无重复字符的最长子字符串

2016-01-16 21:25 381 查看
Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length
of 1.

出处:http://www.programcreek.com/2013/02/leetcode-longest-substring-without-repeating-characters-java/

public class Solution { 

    public int lengthOfLongestSubstring(String s) { 

        if(s==null || s.length()==0)    return 0; 

        boolean[] flag=new boolean[128];  //定义一个128长的字符数组,默认为false

 

        char[] sarray=s.toCharArray();    //把这个字符串转换为数组

        int max=0,begin=0,end=0; 

        for(int i=0;i<sarray.length;++i){ 

            char c=sarray[i]; 

            if(flag[c]){   //好好体会下边的逻辑

                max=Math.max(max,i-begin); 

                for(int j=begin;j<i;++j){ 

                    if(sarray[j]==c){ 

                        begin=j+1;  //寻找重复的那个字符所在的位置,把新的开始的位置置为重复字符所在位置加1

                        break;   //一定要break,结合下一句,因为在新的begin之后的必须不能被置为false,,只能把新的begin前边的置为false

                    } 

                    flag[sarray[j]]=false; 

                } 

            } 

            else 

                flag[c]=true; //把该字符对应的位置置为真

        } 

        return Math.max(max,sarray.length-begin); //注意这句,千万不要忽略了sarray.length-begin这种情况

    } 

}


这个跟上边的一样

public class Solution{

    public int lengthOfLongestSubstring(String s){

        if(s.length()<=1)

            return s.length();

        int prev=0;

        boolean[] letter=new boolean[256];

        int max=0;

        for(int i=0;i<s.length();++i){

            if(!letter[s.charAt(i)])

                letter[s.charAt(i)]=true;

            else{

                while(s.charAt(prev)!=s.charAt(i)){

                    letter[s.charAt(prev)]=false;

                    prev++;

                }

                prev++;

            }

            max=Math.max(max,i-prev+1);

        }

        return max;

    }

}


下边这种解法是我刚开始想到的,可是不知道hashmap里边的size()以及clear()等方法,所以没办法继续往下写了

public class Solution {

    public int lengthOfLongestSubstring(String s) {

        if(s==null || s.length()==0) return 0;

        HashMap<Character,Integer> map=new HashMap<Character, Integer>();

        int max=0;

        for(int i=0;i<s.length();++i){

            if(!map.containsKey(s.charAt(i))){

                map.put(s.charAt(i),i);

            }

            else{

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

                i=map.get(s.charAt(i));   //新的起始位置

                map.clear();

            }

        }

        return Math.max(max,map.size()); //一定不要忘了比较最后的啊

    }  

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: