刷題647. Palindromic Substrings

一、題目說明

題目647. Palindromic Substrings,給定一個字符串,計算所有子串中迴文的數量。難度是Medium!

二、我的解答

這個題目,能想到的是brute force方法:

class Solution{
	public:
		int countSubstrings(string s){
			int len = s.length();
			if(len<1) return 0;
			else if(len<2) return 1;
			int sum = 0;
			for(int i=0;i<len;i++){
				sum += dfs(s,i);
			}
			return sum;
		}
		
		int dfs(string&s,int start){
			int len = s.size();
			if(start == len-1){
				return 1;
			}
			
			int sum = 0;
			for(int i=start;i<len;i++){
				if(checkPalindromic(s.substr(start,i-start+1))){
					sum++;
				}
			}
			return sum;
		}
		
		bool checkPalindromic(string s){
			int len = s.size();
			int mid = len /2;
			for(int i=0;i<=mid;i++){
				if(s[i]!=s[len-i-1]){
					return false;
				}
			}
			return true;
		}
};

性能如下:

Runtime: 492 ms, faster than 7.13% of C++ online submissions for Palindromic Substrings.
Memory Usage: 458.4 MB, less than 8.00% of C++ online submissions for Palindromic Substrings.

三、優化措施

可以用“中心拓展法”,“動態規劃法”。

class Solution{
	public:
		//中心拓展法 
		int countSubstrings(string s){
			res = 0;
			if(s.size()==0) return 0;
			for(int i=0;i<s.size();i++){
				expandAroundCenter(s,i,i);//以i個元素爲中心擴展
				expandAroundCenter(s,i,i+1);// 以i、i+1爲中心擴展 
			}
			return res;
		}
		void expandAroundCenter(string s,int begin,int end){
			while(begin>=0 && end<s.size() && s[begin]==s[end]){
				begin--;
				end++;
				res++;
			}
		}
	private:
		int res;
};

性能:

Runtime: 8 ms, faster than 68.00% of C++ online submissions for Palindromic Substrings.
Memory Usage: 15.6 MB, less than 12.00% of C++ online submissions for Palindromic Substrings.

用dp的代碼及性能如下:

class Solution{
	public:
		//dp[i][j]表示從第i個元素到第j個元素是否是迴文
		//if(dp(i+1)(j-1)==true&&s[i]=s[j]) dp(i)(j)=true 
		//從相鄰的元素出發 
		int countSubstrings(string s){
			int res = 0;
			int len = s.size();
			vector<vector<bool>> dp(len,vector<bool>(len));
			
			for(int j=0;j<len;j++){
				for(int i=j;i>=0;i--){
					if(s[i]==s[j] && ((j-i<2)|| dp[i+1][j-1])){
						dp[i][j] = true;
						res ++;
					}
				}
			}
			return res;
		}
};
Runtime: 20 ms, faster than 42.04% of C++ online submissions for Palindromic Substrings.
Memory Usage: 9.9 MB, less than 48.00% of C++ online submissions for Palindromic Substrings.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章