采用动态规划的思想,具体代码看http://blog.csdn.net/lyy289065406/article/details/6648121很详细,越发感觉到dp的神奇啊。
#include<iostream>
#include<cstring>
#include<string>
#define min(a,b)(a<b?a:b)
using namespace std;
int main(){
int w,l;
while(cin>>w>>l){
string *dic = new string[w];
int *dp = new int[l+1];
char *str = new char[l];
cin>>str;
for(int i=0; i<w; i++)
cin>>dic[i];
dp[l]=0;//代表从l开始到串末尾需要去掉的字符数
for(int i=l-1; i>=0; i--){
dp[i]=dp[i+1]+1;//从最差的情况开始更新
for(int j=0; j<w; j++){//遍历每一字典中的单词
int len = dic[j].length();
if(l-i>=len&&str[i]==dic[j][0]){//如果开头第一个词相等就可以进行具体匹配了
int p = i;
for(int k = 0; p<l&&k<len; ){
if(str[p]==dic[j][k]){
p++; k++;
}
else{
p++;
}
if(k==len)//状态更新
dp[i]=min(dp[i],dp[p]+p-i-len);
}
}
}
}
cout<<dp[0]<<endl;
}
return 0;
}