如何判断两个字符串是否相互包含?

来源:互联网 发布:淘宝助理申通模板 编辑:程序博客网 时间:2024/04/29 10:23

两个连续字符串?语言不限?

class MainClass{public static void Main(string[] args){string a="abcnow";string b="now";if(a.IndexOf(b)>=0)Console.WriteLine("contain");}}

c++实现?

STL find?不行的,么有这种重载

std::find(std::istreambuf_iterator<_CharT>, std::istreambuf_iterator<_CharT>, const _CharT2&)

自己实现:

/*************************************************************************    > File Name: temp.cpp    > Title:  ************************************************************************/#include<iostream>#include<string>#include<algorithm>using namespace std;//在a中寻找b返回在a中索引,没有返回a.size()size_t contain(string& a,string& b){size_t i;for(i=0;i<a.size();++i){if(a[i]==b[0]){size_t j=0,cur=i;  //要设置临时的cur=i;解决类似aab ab的问题while(a[cur++]==b[j++]){if(cur==a.size()||j==b.size())break;}if(j==b.size())return i;}}return i;}int main(){string a("adknow");string b("now");cout<<contain(a,b)<<endl;}


不连续也可以算包含?

可以转化为检查a,b的最长公共子序列是不是等于a或b,典型的DP问题

或者使用上面设置两个指针进行遍历的方法


求取最长公共子序列长度?

令dp[i][j]=f(i,j),表示a的前i与b的前j项的最长公共子序列长度

状态转移方程如下:

int LCS(string& a,string& b){int dp[a.size()+1][b.size()+1];for(int i=0;i<=a.size();++i){for(int j=0;j<=b.size();++j){if(i==0||j==0)dp[i][j]=0;else if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;elsedp[i][j]=max(dp[i-1][j],dp[i][j-1]);}}return dp[a.size()][b.size()];}int main(){string a("adknow");string b("now");cout<<LCS(a,b)<<endl;}



0 0
原创粉丝点击