1. 程式人生 > >求字串中不包含重複字元的最長子串的長度

求字串中不包含重複字元的最長子串的長度

題:

已知一個字串,求這個字串中不包含重複字元的最長子串的長度,如abba返回2,aaaaabc返回3,bbbbbbb返回1.

解題思路:

藉助hashmap來解決,map的鍵key存放字串中出現的字元,值value存放該字元當前的位置。

首先建立一個頭指標now,指向當前子串的開頭,maxLength儲存當前最大長度;剛開始,now指向字串的第一個字元,隨著遍歷字串,如果map中不包含當前字元,那麼now不變,用字元當前位置和now的位置相減,然後再與最大長度進行比較,更新maxLength;再將當前字元以及它的位置儲存到map中;如果map中包含當前字元,則需改變頭指標now所指的位置(將頭指標當前位置與map中當前字元所存位置的下一個位置進行比較,選擇最大者作為最新頭指標所指位置),然後再更新maxLength;不管map中有無當前字元,都需在map中更新,記錄字元最近出現的位置。

比如:abba

(1)初始:maxLength=0;

(2)abba:map中不含該字元, now 指向第一個a; map中新增該字元及其位置,<a,0>; maxLength=1;

(3)abba: map中不含該字元,now指向第一個a; map中新增該字元及其位置,<b,1>; maxLength=2;

(4)abba: map中含有相同字元b,now更新,指向2  { [(map中b的位置為1 ) +1 ] > (now=0)};map中更新該字元及其位置,<b,2>; maxLength=1;

(5)abba: map中含有該字元,更新map種該字元最新位置,<a,3>;now指向第二個b,maxLength=2;

程式碼如下:

import java.util.HashMap;
import java.util.Map;

public class LongestNoRepeatCharactorSubstring {

	//求最長無重複字元子串
	public static int lengthOfLongestSubstring(String s){
		
		
		Map<Character,Integer>  map = new HashMap<Character,Integer>();
		//map中的鍵key存放字串中出現的字元,值value存放該字元當前的位置
		
		int maxLength = 0;	//儲存最長字串長度
		int now = 0;		//記錄頭指標位置
		
		for(int i=0; i<s.length(); i++ ){
			
			if(map.containsKey(s.charAt(i))){//如果map中已存在當前字元
				now = Math.max(now, map.get(s.charAt(i))+1);//更新當前指標位置,如果當前指標大,則使用當前指標,否則使用該指標下一個字元的位置
				if((i-now+1) > maxLength){
					maxLength = i-now+1;
				}
				
			}else{		//map中不存在當前字元
				
				if((i-now+1) > maxLength){ //更新最長字串的長度
					maxLength = i-now+1;
				}
				
			}
			
			map.put(s.charAt(i), i);//修改當前字元的value,記錄最新位置	
		}
		return maxLength;
	}
	
	public static void main(String[] args) {
		
		String s = "abba";
		System.out.println(lengthOfLongestSubstring(s));

	}