修改堆栈中字符串的算法

时间:2016-05-19 08:56:40

标签: c string algorithm

我正在解决堆栈问题。我有一个字符串。每个字母激活push to stack,每个*激活堆栈弹出。

例如

T_I**_MA***SB*E***

获取输出I_AM_BEST

我想创建一个算法,如果可以将星号(*)添加到两个给定字符串中的任何一个,以便重新创建另一个字符串,则可以找出该算法。

例如,我输入了两个字符串s1s2

s1 = "hello"
s2 = "lle"

算法查看s1并验证我可以从字符串1中弹出字符串2。 所以它给了我来自字符串1的输出hell***o

但是,我无法从s1创建s2,因为我会遗漏字母ho

现在我的斗争是找到有效的方法来进行所有比较,因为我需要检查所有的字母和顺序。

如果有人想帮助我,我会非常感激。也可以随时向我询问其他信息。

到目前为止,

Here是我的代码。

编辑: 感谢大家一些非常好的想法,他们让我去,我终于使用这个递归破解了它。只是一个肮脏的工作版。似乎它到目前为止工作:)

char global[40];

void rec(char s1[], char s2[], int b, int l, int count, int cur_count)
{
    if(l >= strlen(s2) || b > strlen(s1))
        return;

    if(cur_count >= count) {
        global[strlen(global)] = s2[l];
        count++;
    }

    if(s1[b] == s2[l])
    {
        global[strlen(global)] = '*';
        rec(s1,s2,++b,0,count,0);
    }
    else {
        rec(s1,s2,b,++l,count,++cur_count);
    }

}


void findString()
{
    char s1[] = "123456";
    char s2[] = "531246";

    rec(s1,s2,0,0,0,0);
    int i = 0;
    for(i=0;i<strlen(global);i++)
        printf("%c",global[i]);

}

3 个答案:

答案 0 :(得分:2)

我会尝试这种方法:

使用字符串表示堆栈 - 称之为st

所以基本的想法是:

while(s1 not empty)
{
    if (st[0] == s2[0])
    {
        // result += '*'
        // pop 
        // remove s2[0]
    }
    else if if (s1[0] == s2[0])
    {
        // result += s1[0] + '*'
        // push
        // pop
        // remove s1[0]
        // remove s2[0]
    }
    else
    {
        // result += s1[0]
        // push
        // remove s1[0]
     }
}

这种方法可以像:

// Initialization
st = ""         // stack - push and pop is done on st[0]
s1 = "hello"
s2 = "lle"
result = ""

// Stack empty -> do nothing
// s1[0] != s2[0] -> just push s1[0] and remove it from s1
st = "h"
s1 = "ello"
s2 = "lle"
result = "h"

// st[0] != s2[0] -> do nothing
// s1[0] != s2[0] -> just push s1[0] and remove it from s1
st = "eh"
s1 = "llo"
s2 = "lle"
result = "he"

// st[0] != s2[0] -> do nothing
// s1[0] == s2[0] -> push and pop s1[0] and remove it from s1 and remove s2[0] 
st = "eh"
s1 = "lo"
s2 = "le"
result = "hel*"

// st[0] != s2[0] -> do nothing
// s1[0] == s2[0] -> push and pop s1[0] and remove it from s1 and remove s2[0] 
st = "eh"
s1 = "o"
s2 = "e"
result = "hel*l*"

// st[0] == s2[0] -> pop and remove s2[0]
st = "h"
s1 = "o"
s2 = ""
result = "hel*l**"

// s2 empty -> just push the rest of s1
st = "oh"
s1 = ""
s2 = ""
result = "hel*l**o"

请注意,我得到的字符串"hel*l**o与您的示例(即hell***o)不同,但它仍会生成正确的输出。

答案 1 :(得分:1)

这很简单。 Char指针在这里最有用,易于实现。 首先,你会发现哪个字符串更大,哪个字符串更小。 现在我们必须比较bug中是否包含较小的字符串。现在使用strrev(char pointer)反转较小的字符串并将其存储在另一个char指针中。 您可以使用:

   strncmp(bigger string(char pointer),smaller string(char pointer),size of smaller string);

现在检查简单和反向较小的字符串。如果找到匹配项,此函数将返回0 现在,您从较大的字符串中删除第一个字符,然后执行相同的过程。然后再次移除,直到较大的弦的长度小于较小的弦 如果两个字符串的长度相等,那么只需使用strcmp(string1,string2);,如果找到匹配项,也会返回0

在字符指针中存储字符串的示例:

Char *str= "string\0";

如果您执行str++,那么它现在就会打印出#34;&#34; 。 这样你就可以从字符串中删除第一个字符。

答案 2 :(得分:0)

如果我正在处理这个问题,那么我就不会使用堆栈来检查s2是否可以弹出s1。如果您已在内存中定义了s2s1,那么您可以逐个字符地将它们作为数组进行处理。

可能有很多方法可以解决这个问题,但我会编写一个递归函数来检查s2的每个字符是否可以通过向s1添加星号来生成。

对于s2的每个字符,我会查看s1以查看是否存在匹配,以便可以从堆栈中弹出一个字符&#39;对于s2的第一个字符,然后查看是否可以从堆栈中弹出下一个字符(字符串中的前一个字符) - 如果它不能继续通过s1查找下一个字符等直到用完s1字符排序或s2字符匹配为止。