纸上得来终觉浅,绝知此事要躬行
1动态规划
1.1字符串最长公共子序列LCS
给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。
输入:text1 = “abcde”, text2 = “ace”
输出:3
解释:最长公共子序列是 “ace”,它的长度为 3。
class Solution {
public:
int longestCommonSubsequence(string text1, string text2) {
vector<vector<int> > dp(text1.size()+1,vector<int>(text2.size()+1,0));
//dp[i][j]表示text1[0..i-1]和text2[0..j-1]的最长公共子串未dp[i][j]
for(int i=1;i<text1.size()+1;i++)
{
for(int j=1;j<text2.size()+1;j++)
{
//状态转移方程
if(text1[i-1] == text2[j-1])
dp[i][j] = dp[i-1][j-1] + 1;
else
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[text1.size()][text2.size()];
}
};
1.2字符串最长公共子串
子串必须连续,子序列可以不连续。
只需将LCS中状态转移方程改为
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
string text1,text2;
getline(cin, text1);
getline(cin, text2);
vector<vector<int> > dp(text1.size() + 1, vector<int>(text2.size() + 1, 0));
int maxl = 0,k1 = 0,k2 = 0;
for (int i = 1;i < text1.size() + 1;i++)
{
for (int j = 1;j < text2.size() + 1;j++)
{
//状态转移方程
if (text1[i - 1] == text2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
if (dp[i][j] > maxl) {
maxl = dp[i][j];
k1 = i-1;
k2 = j-1;
}
}
}
cout << "最长子串长度:" << maxl << endl;
cout << "最长子串在text1中为:" << text1.substr(k1 - maxl + 1, maxl) << endl;
cout << "最长子串在text2中为:" << text2.substr(k2 - maxl + 1, maxl) << endl;
system("pause");
return 0;
}
1.3 编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。力扣
你可以对一个单词进行如下三种操作:插入一个字符、删除一个字符替换一个字符
int minDistance(string word1, string word2) {
int r = word1.size()+1;
int c = word2.size()+1;
vector<vector<int>> dp(r,vector<int>(c,0));
//dp[i][j]表示将word1[0..i-1]变换成word2[0...j-1]所作的最少操作次数
for(int j=0;j<c;j++)
dp[0][j] = j; //word1 为空字符串 只做插入操作
for(int i=0;i<r;i++)
dp[i][0] = i; //word2为空字符串 只做删除操作
for(int i=1;i<r;i++){
for(int j=1;j<c;j++){
if(word1[i-1]==word2[j-1]) //注意下标
dp[i][j] = dp[i-1][j-1];
else
dp[i][j] = min(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1; //分别对应插入、删除、替换
}
}
return dp[r-1][c-1];
}
1.4字符串匹配KMP
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。力扣
输入: haystack = “hello”, needle = “ll”
输出: 2
(1)调用库函数,哈哈哈
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()==0)
return 0;
string::size_type p = haystack.find(needle);
if(p!=haystack.npos)
return p;
else
return -1;
}
};
(2)暴力解法,正常人都这样想好吗
class Solution {
public:
int strStr(string haystack, string needle) {
if(needle.size()==0)
return 0;
int i=0, j=0; //双指针
int