字符串分解的面试题,该怎么处理
字符串分解的面试题
输入:一个字符串。
输出:提供一个isWord(string s)的函数,分解字符串到单词。
例子:
输入:thisisawesome.
输出: this is awe some
this is awesome
应为isWord(awe) = true, isWord(some)= tue, isWord(awesome)= true,所以有两个答案。
我在网上看到的个一个答案是用递归做的
但是这样只能得到一个解this is awesome,不能得到this is awe some
请指点一下。
------解决方案--------------------
doit找到一个解后就返回了,所以它只能找到一个解。要找到所有的解,就要把“return”出现的地方换成以某种方式存储找到的解(打印出来或放到数组中等)。
另外,递归的终止条件也不能是"if (s.size() == 0
------解决方案--------------------
isWord(s) = true)", 因为即使s是一个单词,你仍然想检查s是否可以分成更小的单词,所以把 isWord的部分去掉。
下面的python代码是采用的把解存到数组中的办法:
------解决方案--------------------
其实这样更加简洁,而且上面那段会产生错误的。
void doit(string &s,string all)
{
if(s.size() == 0)
{
cout << all << " " << s << endl;
}
for(int i=1;i<=s.size();++i)
{
string pre = s.substr(0,i);
if(isWord(pre))
{
doit(s.substr(i),string(all + " " + pre));
输入:一个字符串。
输出:提供一个isWord(string s)的函数,分解字符串到单词。
例子:
输入:thisisawesome.
输出: this is awe some
this is awesome
应为isWord(awe) = true, isWord(some)= tue, isWord(awesome)= true,所以有两个答案。
我在网上看到的个一个答案是用递归做的
string doit(string &s)
{
if(s.size() == 0 || isWord(s) = true)
{
return s;
}
for(int i = 0; i<s.size(); ++i)
{
string pre = s.substr(0, i);
if(isWord(pre))
{
string suf = doit(s.substr(i));
if(suf != string(""))
{ return pre + " " + suf; }
}
}
return string("");
}
但是这样只能得到一个解this is awesome,不能得到this is awe some
请指点一下。
------解决方案--------------------
doit找到一个解后就返回了,所以它只能找到一个解。要找到所有的解,就要把“return”出现的地方换成以某种方式存储找到的解(打印出来或放到数组中等)。
另外,递归的终止条件也不能是"if (s.size() == 0
------解决方案--------------------
isWord(s) = true)", 因为即使s是一个单词,你仍然想检查s是否可以分成更小的单词,所以把 isWord的部分去掉。
下面的python代码是采用的把解存到数组中的办法:
In [25]: def isWord(s):
...: return s in ['this', 'is', 'awe', 'some', 'awesome']
In [26]: def doit3(s):
...: if len(s) == 0:
...: return ['']
...: result = []
...: for i in range(1, len(s)+1):
...: if isWord(s[:i]):
...: for suf in doit3(s[i:]):
...: result.append(s[:i] + ' ' + suf)
...: return result
In [27]: doit3('thisisawesome')
Out[27]: ['this is awe some ', 'this is awesome ']
------解决方案--------------------
其实这样更加简洁,而且上面那段会产生错误的。
void doit(string &s,string all)
{
if(s.size() == 0)
{
cout << all << " " << s << endl;
}
for(int i=1;i<=s.size();++i)
{
string pre = s.substr(0,i);
if(isWord(pre))
{
doit(s.substr(i),string(all + " " + pre));