字符串算法——最长子串(无重复元素)

来源:互联网 发布:nginx 访问权限 编辑:程序博客网 时间:2024/05/19 22:52

问题:给定一个字符串,找出最长的无重复元素的子串
例如:
“bbbbbb”的子串为”b”
“abcabccd”的子串为”abc”
两种思路,一种是从头开始依次比较,例如:
字符串为:”abcabccd”,从第一个字符元素”a”开始,直到”abca”发现出现重复元素,则从第二个字符元素”b”开始重复上述操作,比较得到的长度,

class Solution {    public int lengthOfLongestSubstring(String s) {        int len =s.length();//字符串长度        if(len==0)return 0;        int maxlen = 1;//存储子串长度        int i=0;        while(true){            boolean flag[] = new boolean[256];//标记是否出现重复元素            int point = i+1;            flag [s.charAt(i)]= true;            while(point<len && !flag[s.charAt(point)]){//判断该字符元素是否出现过                flag[s.charAt(point)]=true;                if(maxlen<point-i+1){//判断是否找到更大的子串长度                    maxlen = point-i+1;                }                point++;            }            i++;            //判断是否跳出循环            if(i>=len){                break;            }        }            return maxlen;    }}

另一种思路是跳跃式比较,例如:
字符串为”abcbaccd”,一开始从第一个字符元素开始比较,到”abcb”发现出现重复字符元素”b”,这时候不从第二个字符元素”b”开始比较,因为比较后发现不会比前一个子串更长,这里从出现重复字符元素前一个该字符元素后一位开始比较,即从第三个字符元素”c”开始,降低时间复杂度。

class Solution {    public int lengthOfLongestSubstring(String s) {    int length = s.length();//字符串长度        if(length ==0){            return 0;        }        int start = 0;        int i = start;//每次比较的起始位置        int max = 1;//存储最长子串长度        while(i<length){            boolean flag[] = new boolean[256];//标记是否出现重复字符元素            for(;i<length;i++){                if(!flag[s.charAt(i)]){                    flag[s.charAt(i)] = true;                    if(max<i-start+1){                        max = i-start+1;                    }                }else{                    start = s.indexOf(s.charAt(i),start)+1;//下次比较的起始点                    i=start;                    break;                }            }        }        return max;    }}