| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5446 人关注过本帖
标题:怎么把非回文字符串添加最少的字符成为回文字符串
只看楼主 加入收藏
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
结帖率:97.06%
收藏
已结贴  问题点数:100 回复次数:11 
怎么把非回文字符串添加最少的字符成为回文字符串
/*回文字符串
时间限制:3000 ms  |  内存限制:65535 KB
难度:4
描述
所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba"。
当然,我们给你的问题不会再简单到判断一个字符串是不是回文字符串。
现在要求你,给你一个字符串,可在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。

输入
第一行给出整数N(0<N<100)
接下来的N行,每行一个字符串,每个字符串长度不超过1000.
输出
每行输出所需添加的最少字符数
样例输入
1
Ab3bd样例输出
2
*/

#include <stdio.h>
#include <string.h>

//int len;//数组长度
//char str[100];//定义数组
typedef struct _Save_Str
{
//    int num;
    char str[100];
    struct string *next;
}Save_Str;//构造存储二叉树数据的结构体


int huiwen(char *str)//判断是否回文
{
    int i;
    int len = strlen(str);

//    len = strlen(str);
    for(i = 0; i < len/2; ++i)
        if(str[i] != str[len -i -1])
            return 0;//不是回文返回0

    return 1; //回文返回1
}

int add_af(char *str, int num)//从后面加。。。str表示字符串首地址,num表示从前面数第几个字符不同
{
    int len = strlen(str);
    int i;

    for(i = 0; i < num; ++i)
        str[len - i] = str[len -i -1];
    str[len - num] = str[num];
    str[++len] = '\0';
    return len;//返回字符串的长度

}

int add_bf(char *str, int num)//从前面加。。str表示字符串首地址,num表示从前面数第几个字符不同

{
    int i, len = strlen(str);
    for(i = 0; i < (len - num); ++i)
        str[len - i] = str[len -i -1];
    str[num] = str[len - num];
    str[++len] = '\0';
    return len;//返回字符串的长度
}




void main(void)
{
     /*这里应该要用二叉树的知识,但我不懂,期待高手支招*/
}

对这个问题我的想法是这样的:
    要把一个非回文字符串变成一个回文字符串,无非是找到不同的,从前面加一个字母,或者后面加一个字母
这两个函数我都写好了,现在就差把他们组合起来,菜鸟级的我不懂
搜索更多相关主题的帖子: 字符串 时间 
2011-02-21 07:31
『点点滴滴』
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:168
专家分:1035
注 册:2007-7-9
收藏
得分:100 
动态规划
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define max( a , b ) ( (a) > (b) ? ( a ) : ( b ) )
const int MAXN=1010;
int res[MAXN][MAXN];
int main()
{   
    int m;   
    cin>>m;     
    while(m--)   
    {         
        int i,j;        
        string a,b;        
        cin>>a;        
        b=a;        
        a="0"+a;        
        reverse(b.begin(),b.end());        
        b="0"+b;         
        for(i=1;i!=a.size();i++)        
        {            
            for(j=1;j!=b.size();j++)            
            {                 
                if(a[i]!=b[j])               
                {                  
                    res[i][j]=max(res[i][j-1],res[i-1][j]);               
                }               
                else            
                {                    
                    res[i][j]=res[i-1][j-1]+1;               
                }            
            }         
        }      
        cout<<a.size()-res[i-1][j-1]-1<<endl;   
    }   
    return 0;
}
你说的意思不太懂。
不明白为什么要用二叉树。
:1.判断字符串前后俩个字符是否相同,如果相同,则删去这俩字符,判断剩余的字符,不需要添加字符。
2.如果不相同,则添加最少的字符的数量 = min((在字符串前添加和末尾一样的字符,删除末尾字符,判断其余字符串),(在字符串后添加和前边一样的字符,删除前边的字符, 判断其余字符串) ) + 1 ;很容易用递归实现,不过考虑到会超时,可以用数组保存计算过程中的结果,避免不必要的重复计算。
可以参考 编程之美 之计算字符串的相似度

[ 本帖最后由 『点点滴滴』 于 2011-2-21 09:46 编辑 ]
收到的鲜花
  • huangapple2011-02-21 21:42 送鲜花  10朵   附言:好文章
2011-02-21 09:27
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-02-21 11:02
huangapple
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:545
专家分:1790
注 册:2010-12-30
收藏
得分:0 
不能打乱,只能在任意位置添加字符,最少再添加几个字符,可以使这个字符串成为回文字符串。
所以二楼说的删除就不行了,
我菜,只想到用二叉树遍历


勤能补拙,熟能生巧!
2011-02-21 12:09
xjturiver
Rank: 2
等 级:论坛游民
帖 子:14
专家分:12
注 册:2011-1-7
收藏
得分:0 
我说的删除不是正的删除字符。
s = "hello!" ;
char * p = s ;
你可以这么理解,删除第一个字符,相当于p++ ,就是第一个字符不用考虑了;
删除最后一个字符同理。
你去看看编程之美的计算字符串相似度,看完后肯定可以做出这个题目
2011-02-21 12:22
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2011-02-21 12:51
pcbaichi
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:486
专家分:1185
注 册:2010-11-13
收藏
得分:0 
除了二叉树,其他我一点想法都没有

免费赠送河蟹一只
2011-02-21 12:51
犬虫门心
Rank: 8Rank: 8
来 自:西安
等 级:蝙蝠侠
帖 子:209
专家分:753
注 册:2011-1-25
收藏
得分:0 
回复 2楼 『点点滴滴』
学习了!很经典啊!

当一名对得起学生学费的老师,一直是我的目标!我会更努力的!
2011-02-21 15:04
刘定邦
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:687
专家分:1570
注 册:2010-9-21
收藏
得分:0 
学习。学习。
2011-02-21 15:11
广陵绝唱
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:29
帖 子:3607
专家分:1709
注 册:2008-2-15
收藏
得分:0 
我想,在字符串中如何找到一个最佳位置是此题的难点.
2011-02-21 18:54
快速回复:怎么把非回文字符串添加最少的字符成为回文字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014847 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved