字符串分解的面试题

lood339 2012-12-11 01:04:02
输入:一个字符串。
输出:提供一个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
请指点一下。
...全文
132 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜡笔小新啦 2012-12-12
  • 打赏
  • 举报
回复
其实这样更加简洁,而且上面那段会产生错误的。 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)); } } }
panghuhu250 2012-12-11
  • 打赏
  • 举报
回复
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 ']
蜡笔小新啦 2012-12-11
  • 打赏
  • 举报
回复
你只需要增加一个参数来存储之前出现过的字符就可以了。 string 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)) { string suf = doit(s.substr(i),string(all + " " + pre)); if(suf == "") return s; } } return string(""); }
本文的写作目的并不在于提供C/C++程序员求职面试指导,而旨在从技术上分析面试题的内涵。文中的大多数面试题来自各大论坛,部分试题解答也参考了网友的意见。   许多面试题看似简单,却需要深厚的基本功才能给出完美的解答。企业要求面试者写一个最简单的strcpy函数都可看出面试者在技术上究竟达到了怎样的程度,我们能真正写好一个strcpy函数吗?我们都觉得自己能,可是我们写出的strcpy很可能只能拿到10分中的2分。读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次。此外,还有一些面试题考查面试者敏捷的思维能力。   分析这些面试题,本身包含很强的趣味性;而作为一名研发人员,通过对这些面试题的深入剖析则可进一步增强自身的内功。   2.找错题   试题1: void test1() {  char string[10];  char* str1 = "0123456789";  strcpy( string, str1 ); }   试题2: void test2() {  char string[10], str1[10];  int i;  for(i=0; i<10; i++)  {   str1[i] = 'a';  }  strcpy( string, str1 ); }   试题3: void test3(char* str1) {  char string[10];  if( strlen( str1 ) <= 10 )  {   strcpy( string, str1 );  } }   解答:   试题1字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;   对试题2,如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分;   对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。   剖析:   考查对基本功的掌握:   (1)字符串以’\0’结尾;   (2)对数组越界把握的敏感度;   (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:   2分 void strcpy( char *strDest, char *strSrc ) {   while( (*strDest++ = * strSrc++) != ‘\0’ ); }   4分 void strcpy( char *strDest, const char *strSrc ) //将源字符串加const,表明其为输入参数,加2分 {   while( (*strDest++ = * strSrc++) != ‘\0’ ); }   7分 void strcpy(char *strDest, const char *strSrc) {  //对源地址和目的地址加非0断言,加3分  assert( (strDest != NULL) && (strSrc != NULL) );  while( (*strDest++ = * strSrc++) != ‘\0’ ); }   10分 //为了实现链式操作,将目的地址返回,加3分! char * strcpy( char *strDest, const char *strSrc ) {  assert( (strDest != NULL) && (strSrc != NULL) );  char *address = strDest;  while( (*strDest++ = * strSrc++) != ‘\0’ );   return address; } 从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!   (4)对strlen的掌握,它没有包括字符串末尾的'\0'。   读者看了不同分值的strcpy版本,应该也可以写出一个10分的str

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧