字符串最大回文子串的查找java實現

一,字符串的迴文判斷

判斷一個字符串是否爲迴文

問題描述,給定一個字符串,如String T="madam";要判斷該字符串是否爲迴文

方法一:1,定義兩個字符串元素指針(注意java沒有指針的概念),int right=T.length()-1 ;int left=0;

2,即left從左邊開始,right從右邊開始,依次比較所指的字符是否相等,若相等,則將left++,right--;否則,直接返回不是迴文

while(left<right){

if(T.charAt(left)!=T.charAt(right))

return false;

left++;

right--;

}

return true;

代碼:

/*
	 * 3:
	 * 迴文判斷
	 * 問題描述:迴文,英文palindrome,指一個順着讀和反過來讀都一樣的字符串,比如madam、我愛我,
	 * 方法一:
	 * 分析:使用兩個"指針"分別從字符串頭和尾掃描,若每一個"指針"所指值都相等,這爲迴文
	 */
	public boolean isPalindrome(String s){
		if(s==null)
			return false;
		int left=0;
		int right=s.length()-1;
		while(left<right){
			if(s.charAt(left)!=s.charAt(right))
				return false;
			left++;
			right--;
		}
		return true;
	}
方法二:迴文字符串如"madam",若將其全部反轉,則還是得到其本身"madam",在將兩個字符串比較,若相等,則爲迴文

1,實現一個將字符串反轉的函數

	/*
	 * 實現一個字符串的反轉函數
	 */
	private String reverse(String str){
		String strResult="";
		for(int i=str.length()-1;i>=0;i--){
			strResult+=str.charAt(i);
		}
		return strResult;
	}
2,對於目標字符串s,首先將其反轉temp=reverse(s),然後在判斷temp.equals(s)

/*
* 將字符串倒置,再與原字符串進行比較,若相等,則爲迴文,否則不是
* 算法時間複雜度爲O(n)
*/
public boolean isPalindrome2(String s){
String temp=reverse(s);
if(s.equals(temp))
return true;
else
return false;
}


二:如何求一個給定字符串的最大回文字符串

例如,給定字符串String T="google",如何求其最長的迴文子字符串"goog"

1,最簡單直接的想法就是:找出字符串的所有子串,然後判斷每一個子串是否是迴文,並記錄,比較求出最大長度的迴文,*算法時間複雜度爲O(n^3)

	/*
	 * 4,求最長迴文子串
	 *問題描述:給定一個字符串求出其所有子串中最長的迴文子串,例如google字符串,最長子串爲goog
	 *分析:
	 *1,最簡單直接的想法就是:找出字符串的所有子串,然後判斷每一個子串是否是迴文,並記錄,比較求出最大長度的迴文
	 *算法時間複雜度爲O(n^3)
	 */
	public String longestPalindrome1(String s){
		String result=null;
		String tempString="";
		//定義最長迴文子串的長度
		int max=0;
		//遍歷字符串中的所有元素
		for(int i=0;i<s.length();i++){
			//數組下標指針j從字符串後面開始往前遍歷
			for(int j=s.length()-1;j>i;j--){
				//判斷每一個字符串時候爲迴文
				tempString=s.subStr( i, j+1);
				//如果tempString是迴文子串並且其長度(j-i+1)>max
				if(isPalindrome(tempString)&&(j-i+1)>max){
					max=j-i+1;
					result=subString(i, j+1);
				}
			}
		}
		return result;
	}
2,第二種思路就是對於字符串中的每一個字符T[i],判斷
以T[i],T[i+1]爲中心的偶數長度子字符串是迴文
T[i]爲中心的奇數長度子字符串是否是迴文
public String longestPalindrome2(String T){
		String result=null;
		//存放最大回文字符串的長度
		int max=0;
		//遍歷每一個字符,以每一個字符爲中心判斷奇偶擴展子串
		for(int i=0;i<T.length();i++){
			//定義兩個數組下標指針,以i,i+1爲中心的偶子序列
			int pStart=i;
			int pEnd=i+1;
			while(pStart>=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){
				pStart--;
				pEnd++;
			}
			//如果子字符串的長度>max,則暫存爲最長子迴文串  子迴文串的長度=(pEnd-1)-(pStart+1)-1=pEnd-pStart-1
			if(pEnd-pStart-1>max){
				max=pEnd-pStart-1;
				result=subString( pStart+1, pEnd-1+1);
			}
			
			//以i爲中心,判斷擴展奇序列是否爲迴文串
			pStart=i-1;
			pEnd=i+1;
			while(pStart>=0&&pEnd<=(T.length()-1)&&T.charAt(pStart)==T.charAt(pEnd)){
				pStart--;
				pEnd++;
			}
			if (pEnd-pStart-1>max) {
				max=pEnd-pStart-1;
				result=subStrint(T, pStart+1, pEnd-1+1);
			}
		}
		return result;
	}
	
三,運行時間O(N)的判斷方法

還在努力學習中,後續補上........

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章