算法--最長無重復字符子串


轉載請標明出處http://www.cnblogs.com/haozhengfei/p/d0906ebc98f7b6eaecb3ecd738dc78ac.html 


最長無重復字符子串練習題

 
最長無重復字符子串練習
 

第12節 最長無重復字符子串練習題

對於一個字符串,請設計一個高效算法,找到字符串的最長無重復字符的子串長度。

給定一個字符串A及它的長度n,請返回它的最長無重復字符子串長度。保證A中字符全部為小寫英文字符,且長度小於等於500。

測試樣例:
"aabcb",5
返回:3
 
 
1
import java.util.*;
2
 
                               
3
public class DistinctSubstring {
4
    public int longestSubstring(String A, int n) {
5
        //charPosition統計A中每種字符之前出現的位置
6
        Map<Character, Integer> charPosition = new HashMap<Character, Integer>();
7
        //preArr代表以s[i-1]結尾的情況下,最長無重復子串的長度
8
        int[] preArr = new int[A.length()];
9
 
                               
10
        char[] str2charArr = A.toCharArray();
11
        //從頭到尾遍歷str2charArr,統計出以每個字符為當前位置的向前最長無重復子串的長度
12
        for(int i=0; i<A.length(); i++){
13
            Integer lastPosOfChar = charPosition.get(str2charArr[i]);
14
            if(lastPosOfChar == null){//說明當前字符第一次出現
15
                //更新最長無重復子串的長度
16
                preArr[i] = i == 0 ? 1 : preArr[i-1] + 1;
17
                //記錄當前字符出現的位置
18
                charPosition.put(str2charArr[i], i);
19
            }
20
            else{//當前字符不是第一次出現(既然不是第一次出現,那也不是在第一個位置),也就是之前出現過該字符
21
                //獲取前一個字符最長無重復子串的長度
22
                int aPos = lastPosOfChar + 1;
23
                int unRepeatLen = preArr[i-1];
24
                int bPos = i - unRepeatLen;
25
                if(aPos >= bPos){
26
                    //當前位置的最長無重復子串長度
27
                    preArr[i] = i - aPos + 1;
28
                }
29
                else{
30
                    //當前位置的最長無重復子串長度
31
                    preArr[i] = i - bPos + 1;
32
                }
33
                //跟新當前字符出現的位置
34
                charPosition.put(str2charArr[i], i);
35
            }
36
        }
37
        //遍歷preArr,最大值即為所求
38
        int max = preArr[0];
39
        for(int i: preArr) if(i > max) max = i;
40
 
                               
41
        return max;
42
    }
43
}
 
 
您的代碼已保存
答案正確:恭喜!您提交的程序通過了所有的測試用例
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM