char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
int p=-1;
char *ans="";
int len_of_s=strlen(s);
int dp[len_of_s+1][26];
for(int i=0;i<26;i++)
dp[len_of_s][i]=len_of_s;
for(int i=len_of_s-1;i>=0;i--)
{
for(int j=0;j<26;j++)
{
if((s[i]-'a')==j)
{
dp[i][j]=i;
}
else
{
dp[i][j]=dp[i+1][j];
}
}
}
//printf("%d\n",strlen(ans));
for(int i=0;i<dictionarySize;i++)
{
printf("当前字符串为%s\n",dictionary[i]);
int flag=1;
int j=0;
int index=0;
int len_of_t=strlen(dictionary[i]);
while(j<len_of_t)
{
//printf("j=%d,t[%d]=%c\n",j,j,t[j]);
//printf("dp[0][0]=%d\n",dp[0][0]);
if(dp[index][(dictionary[i][j]-'a')]<len_of_s) //找到了
{
index=dp[index][(dictionary[i][j]-'a')]+1;
}
else
{
printf("不符合要求\n");
flag=0;
break;
}
//printf("111\n");
j++;
}
if(flag==0)
continue;
printf("符合要求\n");
//符合要求
if(p==-1)
{
p=i;
}
else
{
if(strlen(dictionary[i])>strlen(dictionary[p]))
{
p=i;
}
else if(strlen(dictionary[i])==strlen(dictionary[p]))
{
if(strcmp(dictionary[i],dictionary[p])<0)
{
p=i;
}
}
}
/*
if(strlen(ans)==0)
{
ans=dictionary[i];
}
else
{
if(strlen(dictionary[i])>strlen(ans))
{
ans=dictionary[i];
}
else if(strlen(dictionary[i])==strlen(ans))
{
if(strcmp(dictionary[i],ans)<0)
{
ans=dictionary[i];
}
}
}
*/
}
/*
if(ans==NULL)
return NULL;
return ans;
*/
if(p==-1)
return "";
return dictionary[p];
}
优化过后
bool func(char*t,int len_of_s,int dp[][26])
{
int j=0,index=0,len_of_t=strlen(t);
while(j<len_of_t)
{
if(dp[index][(t[j]-'a')]<len_of_s)
index=dp[index][(t[j]-'a')]+1;
else
return false;
j++;
}
return true;
}
char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
int p=-1,len_of_s=strlen(s),dp[len_of_s+1][26];
for(int i=0;i<26;i++)
dp[len_of_s][i]=len_of_s;
for(int i=len_of_s-1;i>=0;i--)
{
for(int j=0;j<26;j++)
{
if((s[i]-'a')==j)
dp[i][j]=i;
else
dp[i][j]=dp[i+1][j];
}
}
for(int i=0;i<dictionarySize;i++)
{
if(func(dictionary[i],len_of_s,dp)
&&(p==-1||strlen(dictionary[i])>strlen(dictionary[p])
||((strlen(dictionary[i])==strlen(dictionary[p]))
&&strcmp(dictionary[i],dictionary[p])<0)))
p=i;
}
if(p==-1)
return "";
return dictionary[p];
}
又遇到传递二维数组的问题 这里形参用dp[][26] 指明第二维维数解决
用一个指针 指向答案
bool func(char*t,int len_of_s,int dp[][26])
{
int j=0,index=0,len_of_t=strlen(t);
while(j<len_of_t)
{
if(dp[index][(t[j]-'a')]<len_of_s)
index=dp[index][(t[j]-'a')]+1;
else
return false;
j++;
}
return true;
}
char * findLongestWord(char * s, char ** dictionary, int dictionarySize){
int p=-1,len_of_s=strlen(s),dp[len_of_s+1][26];
for(int i=0;i<26;i++)
dp[len_of_s][i]=len_of_s;
for(int i=len_of_s-1;i>=0;i--)
{
for(int j=0;j<26;j++)
{
if((s[i]-'a')==j)
dp[i][j]=i;
else
dp[i][j]=dp[i+1][j];
}
}
char* ans=(char*)malloc(1*sizeof(char));
strcpy(ans,"");
char* temp=ans;
for(int i=0;i<dictionarySize;i++)
{
if(func(dictionary[i],len_of_s,dp)
&&(strlen(dictionary[i])>strlen(ans)
||((strlen(dictionary[i])==strlen(ans))
&&(strcmp(dictionary[i],ans)<0))))
{
ans=dictionary[i];
}
}
if(strlen(ans)!=0)
free(temp);
return ans;
}
不能对一个没有分配空间char*指针使用strlen,首先得分配空间
这道题首先要解决子“序列”t是否在主序列s中,可以用两个指针的一般方法
也可以用动态规划的方法降低时间复杂度
对主序列s,长度为m
设dp[i][j]表示i到m-1中字符j的位置,这样指针遍历序列t时,就用dp来找s中的t[p]
来源 leetcode官方题解