典型的DP,开一个数组,第i个元素记录原字符串中以第i个字符结束的最小划分数。d[i] = min{d[j] + 1},0<=j<i,并且j~i之间的字符串可以在字典中查到。
#include<iostream>
#include<cstring>
using namespace std;
const int MaxString = 256;
class Dictionary
{
public:
Dictionary(int word);
int Find(char* word,int length);
private:
int words;
char dictionary[100][MaxString];
};
int main()
{
int data,words,i,j,mem;
char string[MaxString];
int status[MaxString];
Dictionary *d;
cin>>data;
while(data-- > 0)
{
cin>>string>>words;
d = new Dictionary(words);
status[0] = 0;
for(i=1;string[i-1] != '\0';i++)
{
mem = 65535;
for(j=0;j<i;j++)
{
if(mem > status[j] + 1 && d->Find(string+j,i-j))
mem = status[j] + 1;
}
status[i] = (65535 == mem ? status[i-1] : mem);
}
delete(d);
cout<<status[i-1]<<endl;
}
return 0;
}
Dictionary::Dictionary(int word)
{
words=word;
for(int i=0;i<words;i++)
cin>>dictionary[i];
}
int Dictionary::Find(char* word,int length)
{
int flag;
char *t,*s;
for(int i=0;i<words;i++)
{
if(strlen(dictionary[i]) != length) continue;
flag = 1;
t = word;s = dictionary[i];
while(*s)
{
if(*t++ != *s++)
{
flag = 0;
break;
}
}
if(flag) return 1;
}
return 0;
}
#include<cstring>
using namespace std;
const int MaxString = 256;
class Dictionary
{
public:
Dictionary(int word);
int Find(char* word,int length);
private:
int words;
char dictionary[100][MaxString];
};
int main()
{
int data,words,i,j,mem;
char string[MaxString];
int status[MaxString];
Dictionary *d;
cin>>data;
while(data-- > 0)
{
cin>>string>>words;
d = new Dictionary(words);
status[0] = 0;
for(i=1;string[i-1] != '\0';i++)
{
mem = 65535;
for(j=0;j<i;j++)
{
if(mem > status[j] + 1 && d->Find(string+j,i-j))
mem = status[j] + 1;
}
status[i] = (65535 == mem ? status[i-1] : mem);
}
delete(d);
cout<<status[i-1]<<endl;
}
return 0;
}
Dictionary::Dictionary(int word)
{
words=word;
for(int i=0;i<words;i++)
cin>>dictionary[i];
}
int Dictionary::Find(char* word,int length)
{
int flag;
char *t,*s;
for(int i=0;i<words;i++)
{
if(strlen(dictionary[i]) != length) continue;
flag = 1;
t = word;s = dictionary[i];
while(*s)
{
if(*t++ != *s++)
{
flag = 0;
break;
}
}
if(flag) return 1;
}
return 0;
}