查看: 3067|回复: 6
收起左侧

Yahoo : 转换到回文字符串

|只看干货 |刷题
头像被屏蔽

分享帖子到朋友圈
wwwyhx | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

上一篇:Amazon : find BST of max size in a binary tree
下一篇:Yahoo : 找出最长0,1对数相同的子串
kidd_yq@163.com 2011-5-4 19:16:52 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (22)
 
 
0% (0)    👎
回复 1# wwwyhx

#include <iostream>
#include <string>
using namespace std;

#define N 80


bool isHuiWen(string str)
{
int i;
for(i=0;i<str.length()-1-i;i++)
  if(str!=str[str.length()-1-i])
   return 0;
return 1;
}

int getMin(string src,string &dest)
{
if(isHuiWen(src))
{
  dest=src;
  return 0;
}

char p[N];
int top=0;

string temp=src;
string tempL,tempR;
int m1,m2;
   
while(temp[0]==temp[temp.length()-1])
{
  p[top++]=temp[0];  
  temp=temp.substr(1,temp.length()-2);
}

m1=getMin(temp[temp.length()-1]+temp,tempL);
m2=getMin(temp+temp[0],tempR);
if(m1<m2) dest=tempL;
else dest=tempR;
  
while(top>0)
{
  top--;
  dest=p[top]+dest;
  dest+=p[top];
}

return dest.length()-src.length();
}

void main(void)
{
string str,result;
cin>>str;
getMin(str,result);
cout<<result<<endl;
}
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-4 20:07:30 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

kidd_yq@163.com 2011-5-4 20:45:54 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (22)
 
 
0% (0)    👎
本帖最后由 kidd_yq@163.com 于 2011-5-4 20:47 编辑

回复 3# wwwyhx


检测串的头和尾,如果对称则入栈,截取除头尾之外的子串,直到找出最短的非对称的子串,栈中保存了对称的部分;
接下来有两种匹配对称的方法(在串头插入和串尾相同的字符/在串尾插入和串头相同的字符),直到某一次插入后满足回文条件;再将栈中对称的部分插入到串的头和尾;
递归这个过程,选取增加字符数少的子串返回,直到最初输入的串满足回文的标准。
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-4 23:52:16 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
 楼主| wwwyhx 2011-5-4 23:53:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

darksteel 2011-5-5 01:11:23 | 显示全部楼层
本楼: 👍   0% (0)
 
 
0% (0)   👎
全局: 👍   100% (32)
 
 
0% (0)    👎
本帖最后由 darksteel 于 2011-5-5 01:13 编辑

上面两种办法应该都是可行的。递归的办法写起来简练,但如果不保存点信息的话,效率很低,最坏是指数级的。空间最坏是O(n^2)。lz的方法其实有点dp的意思,时间空间都是O(n^2)。我一直在考虑的是有没有复杂度更低的办法,因为字符串可能很长,字符串算法一般O(n^2)都是很难接受的,不过我没想出来。。
但如果O(n^2)是可以接受的话,倒是有比较简练的DP方法,其实这个问题如果问最少add多少字母就是典型的DP问题。要输出结果的话,根据DP中间值把最优解恢复出来就行,代码如下,欢迎指出bug。
  1. #define MAXL 1010
  2. char s[MAXL];
  3. int dp[MAXL][MAXL];
  4. int getPath(int p, int l, char *ans)
  5. {
  6.         if(l < 2) {
  7.                 if(l) *ans = s[p];
  8.                 return l;
  9.         }
  10.         if(s[p] == s[p+l-1]) {
  11.                 *ans = s[p];
  12.                 return 1+getPath(p+1, l-2, ans+1);
  13.         } else if(dp[p][l] == 1+dp[p+1][l-1]) {
  14.                 *ans = s[p];
  15.                 return 1+getPath(p+1, l-1, ans+1);
  16.         } else {
  17.                 *ans = s[p+l-1];
  18.                 return 1+getPath(p, l-1, ans+1);
  19.         }
  20. }
  21. int main()
  22. {
  23.         char ans[MAXL*2];
  24.         cin >> s;
  25.         int i, j, l = strlen(s);
  26.         for(i = 2; i <= l; i++)
  27.                 for(j = 0; j <= l-i; j++) {
  28.                         if(s[j] == s[j+i-1])
  29.                                 dp[j][i] = dp[j+1][i-2];
  30.                         else
  31.                                 dp[j][i] = 1+min(dp[j+1][i-1], dp[j][i-1]);
  32.                 }
  33.         cout << dp[0][l] << endl;
  34.         int len = getPath(0, l, ans);
  35.         ans[l+dp[0][l]] = 0;
  36.         for(i = l+dp[0][l]-1; i >= len; i--)
  37.                 ans[i] = ans[l+dp[0][l]-i-1];
  38.         cout << ans << endl;
  39.         return 0;
  40. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

隐私提醒:
■拉群请前往同学同事飞友|拉群结伴版块,其他版块拉群,帖子会被自动删除
■论坛不能删帖,为防止被骚扰甚至人肉,不要公开留微信等联系方式,请以论坛私信方式发送。
■特定版块可以超级匿名:https://tools.1point3acres.com/thread
■其他版块匿名方法:http://www.1point3acres.com/bbs/thread-405991-1-1.html

>
快速回复 返回顶部 返回列表