Longest Substring Without Repeating Characters

来源:互联网 发布:c语言教案及配套课件 编辑:程序博客网 时间:2024/05/19 15:40

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.

错误思路:最开始想到的是用类似求最大子序列和的方法求,但是有错误。因为每次遇到重复的字符时,直接从当前重复字符+1的位置继续计算最长子序列长。

public class Solution{    public static int lengthOfLongestSubstring(String s) {    int maxlength = 0,tmplength = 0;    int length = s.length();    String string = "";    for(int i = 0; i < length; i++)    {    char c = s.charAt(i);    if(string.indexOf(c) < 0)    {    tmplength++;    string += c;    }    else    {    tmplength = 1;    string = String.valueOf(c);    }    if(maxlength < tmplength)    maxlength = tmplength;    }    return maxlength;}    public static void main(String[] args){// TODO Auto-generated method stubString string= "bbbbbb";System.out.println(lengthOfLongestSubstring(string));}}


 

思路二:分析上述错误原因:每次遇到重复字符,不应该从当前重复字符位置开始,而是从重复的原字符开始下一轮的计算。但在数据量很大的时候,会超时

public static int lengthOfLongestSubstring_1(String s) {    int maxlength = 0,tmplength = 0;    int length = s.length();    String string = "",maxstring = "";    for(int i = 0; i < length; i++)    {    char c = s.charAt(i);    int index = string.indexOf(c);    if(index < 0)    {    tmplength++;    string += c;    System.out.println(string);    }    else    {    int bw = string.length() - index -1;    i = i - bw - 1;    tmplength = 0;    string = "";    }    if(maxlength < tmplength)    {    maxlength = tmplength;    maxstring = string;    }    }    return maxlength;

思路三:Hash

public static int lengthOfLongestSubstring(String s)    {    int start = 0;    int length = s.length();    int maxlength = 0;    int[] map = new int[256];    for(int i = 0; i < length; i++)    {    char c = s.charAt(i);    if(map[c] != 1)    {    map[c] = 1;    maxlength = Math.max(maxlength, i - start + 1);    }    else    {    while(s.charAt(start) != c)    {    map[s.charAt(start)] = 0;    start++;    }    start++;    }    }    return maxlength;        }

思路四:DP

public static int lengthOfLongestSubstring(String s)    {    int length = s.length(),maxlength = 0;    if(length == 0)    return length;    int[] dp = new int[length];    dp[0] = 1;    int last_index = 0;    for(int i = 1; i < length; i++)    for(int j = last_index; j < i; j++)    {    if(s.charAt(j) == s.charAt(i))    {    dp[i] = i - j;    last_index = j + 1;    break;    }    else    dp[i] = dp[i - 1] + 1;    }    for(int i = 0; i < length; i++)    maxlength = Math.max(dp[i], maxlength);    return maxlength;    }


 

0 0