[英]Check if string can be made by joining smaller strings (Recursive function) in C
我是第一次學習遞歸,但在使遞歸函數起作用時遇到了問題。 基本上,我必須查看是否可以通過串聯其他字符串來創建字符串(從命令行)。 如果可能,該函數將返回1,否則返回0。
這是我寫的代碼(對不起,我沒有編碼基礎,編寫的代碼很糟糕,我什至無法調試它,所以我看不到哪里錯了)。
int decomposition(char* argv[],char** strings,int pos,int strings_num){
int i,j,flag=0,flag2=0,tmp=pos,pos2;
char* comp;
char* comp1;
if(pos >= strlen(argv[1]))
return 1;
for(i = 0;i<strings_num;i++){
comp = malloc((strlen(strings[i])+1)*sizeof(char));
comp1 = malloc((strlen(strings[i])+1)*sizeof(char));
strcpy(comp,"a");
flag = 0;
pos = tmp;
while(strlen(strings[i])<=strlen(argv[1])-pos){
for(j = 0;j<strlen(strings[i]);j++){
if(strings[i][j] == argv[1][pos]){
comp1[j] = argv[1][pos];
pos++;
flag = 1;
}
else{
flag = 0;
break;
}
}
}
if(flag == 1 && strlen(comp1)>=strlen(comp)){ //comp1 must be longer than comp...if the string is "hello" between string1="he" and string2="hel" I have to choose string2
strcpy(comp,comp1);
pos2 = pos;
flag2 = 1;
}
}
在這里我有遞歸調用的問題...我知道有什么問題,但我不知道如何糾正...
if(flag2 == 1){
if(decomposition(argv,strings,pos2,strings_num)==1)
return 1;
else
return 0;
}
else
return 0;
}
您想知道是否可以使用其他字符串作為目標字符串。
我不確定您計划遞歸的方式(從代碼中不是很清楚),但是看起來太復雜了。 例如,您不需要任何臨時存儲。
您認為需要選擇最長前綴的假設也是錯誤的。 例如,如果要從“ hel”,“ helm”和“ met”中創建“ helmet”,則選擇最長的匹配項“ helm”時將排除解決方案“ hel·met”。 關於遞歸解決方案的好處是,它使您可以輕松地尋求所有可能的途徑。
您的遞歸如何工作? 掃描所有字符串,並檢查它們是否可以作為目標的前綴。 如果是這樣,請通過遞歸調用該函數來檢查目標減去該前綴是否可以由字符串組成。 如果沒有前綴匹配,則返回false。 如果除去前綴后目標為空,則返回1。
每個遞歸級別都保留其局部變量,因此從函數返回到最后一個級別后,您將進行追溯並再次開始測試該級別的原始字符串。
您將字符串中的當前位置向下傳遞到下一個遞歸級別。 這是一個有效的配置,但是C字符串的一個很好的屬性(實際上只是char數組)是,您可以通過將指針len
char移到右側來輕松地從字符串str
長度為len
的前綴。越過空分隔符。 因此,字符串的其余部分只是str + len
。
這是一個變體,可從命令行獲取所有字符串。 第一個字符串是目標字符串。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int decomposition(const char *target, const char *strings[], size_t n)
{
size_t i;
if (*target == '\0') return 1;
for (i = 0; i < n; i++) {
const char *str = strings[i];
size_t len = strlen(str);
if (strncmp(target, str, len) == 0) {
int res;
res = decomposition(target + len, strings, n);
if (res) return 1;
}
}
return 0;
}
int main(int argc, char *argv[])
{
if (argc < 3) {
printf("Usage: prog targer string(s) ...\n");
} else {
int n = decomposition(argv[1], argv + 2, argc - 2);
printf("%s be done.\n", n ? "Can" : "Can't");
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.