Problem:
Given an input string and a dictionary of words, find out if the input string can be segmented into a space-separated sequence of dictionary words. See following examples for more details. Consider the following dictionary
{ i, like, sam, sung, samsung, mobile, ice,cream, icecream, man, go, mango}
Input: ilike
Output: Yes
The string can be segmented as “i like”.
Input: ilikesamsung
Output: Yes
The string can be segmented as “i like samsung” or “i like sam sung”.
#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
/*
12
mobile samsung sam sung man mango icecream and go i like ice cream
ilike
*/
using namespace std;
string dic[18];
bool dp[1005];
int n;
bool wordFound(string s)
{
for(int i=0;i<n;i++)
if(dic[i].compare(s)==0)
return 1;
return 0;
}
bool wordbreak(string str)
{
int sz=str.size();
memset(dp,0,sizeof(dp));
for(int i=1;i<=sz;i++)
{
if(dp[i]==0 && wordFound(str.substr(0,i))==1)
dp[i]=1;
if(dp[i]==1)
{
if(i==sz)
return 1;
for(int j=i+1;j<=sz;j++)
{
if(dp[j]==0 && wordFound(str.substr(i,j-i))==1)
dp[j]=1;
if(j==sz && dp[j]==1)
return 1;
}
}
}
//cout<<dp[sz-1]<<"\n";
return 0;
}
int main() {
//code
int t;
string str;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
cin>>dic[i];
}
cin>>str;
cout<<wordbreak(str)<<"\n";
}
return 0;
}