leetCode 字符串相關問題

125. 驗證迴文串

/*
* 給定一個字符串,驗證它是不是迴文串,只考慮字母和數字字符,能夠忽略字母的大小寫。
* 輸入: "A man, a plan, a canal: Panama"
輸出: true
迴文串:正讀和反讀都是同樣的字符串。
* */java

 public boolean isPalindrome2(String s){
//		對初始字符串進行預處理
		 s=s.toLowerCase();
		 int low=0;
		 int high=s.length()-1;
		 
		 while(low<high){
			 if(!Character.isLetterOrDigit(s.charAt(low))) low++;
			 else if(!Character.isLetterOrDigit(s.charAt(high))) high--;
			 else if(s.charAt(low)!=s.charAt(high)) return false;
			 else{
				 low++;
				 high--;
			 }
		 }
		 
		 return true;
	 }

  

28. 實現strStr()

 

實現 strStr() 函數。git

給定一個 haystack 字符串和一個 needle 字符串,在 haystack 字符串中找出 needle 字符串出現的第一個位置 (從0開始)。若是不存在,則返回  -1。算法

 

暴力求解方法:數組

public int strStr(String haystack, String needle) {
//		暴力解法
        if(needle.isEmpty()) return -1;
        
        final int N=haystack.length()-needle.length()+1;
        for(int i=0;i<N;i++){
        	int j=i;
        	int k=0;
        	while(j<haystack.length() && k<needle.length() && haystack.charAt(j)==needle.charAt(k)){
        		k++;
        		j++;
        	}
        	if(k==needle.length()){
        		return i;
        	}
        }
        return -1;
    }

 

67. 二進制求和

/*
* 給定兩個二進制字符串,返回他們的和(用二進制表示)。函數

輸入爲非空字符串且只包含數字 1 和 0。
* */ui

 public String addBinary(String a, String b) {
        StringBuilder result=new StringBuilder();
		int i=a.length()-1;
		int j=b.length()-1;
		int carry=0;
		
		while(i>=0 || j>=0 || carry>0){
			int valueA=i<0 ? 0: a.charAt(i--)-'0';
			int valueB=j<0 ? 0: b.charAt(j--)-'0';
			int sum=valueA+valueB+carry;
			result.insert(0, Character.forDigit(sum%2, 10));
			carry=sum/2;
			
		}
		return result.toString();
    }

  

5. 最長迴文子串

給定一個字符串 s,找到 s 中最長的迴文子串。你能夠假設 s 的最大長度爲 1000。code

策略:blog

A:暴力求解:時間複雜度是o(n*2)遞歸

B:記憶化搜索:複雜度 O(n^2) 。設 f[i][j] 表示[i,j]之間的最長迴文子串,遞推方程以下:leetcode

f[i][j] = if (i == j) S[i]
if (S[i] == S[j] && f[i+1][j-1] == S[i+1][j-1]) S[i][j]
else max(f[i+1][j-1], f[i][j-1], f[i+1][j])

C:動態規劃算法:

設狀態爲 f(i,j) ,表示區間[i,j]是否爲迴文串,則狀態轉移方程爲

	/*
	 * 動態規劃問題常常用於求解最優子結構以及重疊子問題,之前咱們常常將重疊子問題
	 * 使用遞歸進行實現,可是有問題的是,會進行大量重複的計算,而動態規劃就是將以前的結果保存下來,避免了沒必要要的
	 * 重複操做,提高了效率。
	 * 
	 * 實現原理:
	 * 藉助一個二維布爾數組
	 * 每一個dp[i][j]表示一個方格,每一個方格中的T與F分別表示當前子串是不是
	 * 迴文字符串。
	 * 再進行轉換的時候,表達式便是str[i]==str[j] && dp[i+1][j-1]
	 * */
	
	
	public String longestPalindrome3(String s){
		
		int len=s.length();
		int maxlen=0;
		String res=null;
		
		boolean [][] dp=new boolean[len][len];
		for(int i=len-1;i>=0;i--){
			for(int j=i;j<len;j++){
				dp[i][j]=s.charAt(i)==s.charAt(j)  && (j-i<3 || dp[i+1][j-1]);
				if(dp[i][j] && (res==null || j-i+1>maxlen)){
					res=s.substring(i,j+1);
					maxlen=res.length();
				}
			}
		}
		
		return res;
	}
相關文章
相關標籤/搜索