我正在解决堆栈问题。我有一个字符串。每个字母激活push to stack,每个*
激活堆栈弹出。
例如
T_I**_MA***SB*E***
获取输出I_AM_BEST
。
我想创建一个算法,如果可以将星号(*
)添加到两个给定字符串中的任何一个,以便重新创建另一个字符串,则可以找出该算法。
例如,我输入了两个字符串s1
和s2
。
s1 = "hello"
s2 = "lle"
算法查看s1
并验证我可以从字符串1中弹出字符串2。
所以它给了我来自字符串1的输出hell***o
。
但是,我无法从s1
创建s2
,因为我会遗漏字母h
和o
。
现在我的斗争是找到有效的方法来进行所有比较,因为我需要检查所有的字母和顺序。
如果有人想帮助我,我会非常感激。也可以随时向我询问其他信息。
到目前为止,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]);
}
答案 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
。如果您已在内存中定义了s2
和s1
,那么您可以逐个字符地将它们作为数组进行处理。
可能有很多方法可以解决这个问题,但我会编写一个递归函数来检查s2
的每个字符是否可以通过向s1
添加星号来生成。
对于s2
的每个字符,我会查看s1
以查看是否存在匹配,以便可以从堆栈中弹出一个字符&#39;对于s2
的第一个字符,然后查看是否可以从堆栈中弹出下一个字符(字符串中的前一个字符) - 如果它不能继续通过s1
查找下一个字符等直到用完s1
字符排序或s2
字符匹配为止。