2020-09-04刷题

tech2022-12-26  65

leetcode-5-最长回文子串 题型:动态规划 难度:中等 题目:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 代码: //动态规划dp[i][j]表示i~j范围的字符串,如果满足回文,那么dp[i+1][j-1]一定也是回文,并且两边加上相同的字符也是回文 class Solution { public: string longestPalindrome(string s) { int nlen = s.size(); vector<vector<int> > dp(nlen,vector<int>(nlen,0)); string res = ""; for(int i=1;i<=nlen;i++)//长度 { for(int left=0;i+left-1<nlen;left++)//满足长度i的,所有左边界 { int right = left+i-1;//右边界 if(i == 1)//只有当前一个字符 { dp[left][right] = 1; } else if(i == 2)//有两个字符,判断这两个字符是否相等 { dp[left][right] = (s[left]==s[right]); } else { if(s[left] == s[right] && dp[left+1][right-1]==1) dp[left][right] = 1; } //和上一次记录的字符串对比,选择长度较大的 if(dp[left][right]==1 && i>res.size() ) { res = s.substr(left,i); } } } return res; } }; leetcode-984-不含AAA或BBB的字符串 题型:字符串 难度:中等 题目:给定两个整数 A 和 B,返回任意字符串 S,要求满足:S 的长度为 A + B,且正好包含 A 个 ‘a’ 字母与 B 个 ‘b’ 字母; 子串 ‘aaa’ 没有出现在 S 中; 子串 ‘bbb’ 没有出现在 S 中。 //让长度长的字符先开始 class Solution { public: string strWithout3a3b(int A, int B) { string res = ""; char a,b; if(A >= B) { a = 'a'; b = 'b'; } else { A = A^B; B = A^B; A = A^B; a = 'b'; b = 'a'; } while(A || B) { if(A) { res += a; A--; } if(A > B) { res += a; A--; } if(B) { res += b; B--; } } return res; } }; leetcode-44-通配符匹配 题型:动态规划 难度:困难 题目:给定一个字符串 (s) 和一个字符模式 § ,实现一个支持 ‘?’ 和 ‘’ 的通配符匹配。’?’ 可以匹配任何单个字符。’’ 可以匹配任意字符串(包括空字符串)。两个字符串完全匹配才算匹配成功。 说明:s 可能为空,且只包含从 a-z 的小写字母。 p 可能为空,且只包含从 a-z 的小写字母,以及字符 ? 和 *。 代码: //动态规划,dp[i][j]代表s[i]和p[j]为止是否匹配,分三种情况 //1.如果p[j]!='?'&&p[j]!='*',那么判断s[i]==p[j],相等则dp[i][j]=dp[i-1][j-1]。 //2.如果p[j]='?',dp[i][j] = dp[i-1][j-1]。 //3.如果p[j]='*',dp[i][j]可能来自dp[i][j-1],也可能来自dp[i-1][j] class Solution { public: bool isMatch(string s, string p) { int len1 = s.size(); int len2 = p.size(); vector<vector<int> > dp(len1+1,vector<int>(len2+1,false)); //如果都为空一定匹配 dp[0][0] = true; //如果p为空,s不为空,一定不匹配 //如果p不为空,s为空,分条件。s全为*才匹配 for(int i=0;i<len2;i++) { if(p[i] == '*') dp[0][i+1] = true; else break;//后面也一定不满足 } for(int i=1;i<=len1;i++) { for(int j=1;j<=len2;j++) { if(s[i-1] == p[j-1]) { dp[i][j] = dp[i-1][j-1]; } else if(p[j-1] == '?') { dp[i][j] = dp[i-1][j-1]; } else if(p[j-1] == '*') { dp[i][j] =( dp[i-1][j]||dp[i][j-1]); } } } return dp[len1][len2]; } };
最新回复(0)