形成回文串所需的最少字符数

青藤工作室在本周进行了第一次面试,简单说了一下寒假作业,进行了简短的交流。然后综观所有,找出了一些特别好看的作品给我们参观,网址为http://47.106.199.169(时间过长,网址可能会失效)。这些人的作品都很好看,艺术细胞较少的我没有上去也心服口服,但我依然会努力。青藤工作室依然是我最喜欢的工作室,现在也只做这个工作室的作业了。现在已经发布了新一阶段的作业。简单的说就是在三个月的时间内把C#或者Java学一学,然后做一个学生管理系统,我暂时认为不难吧。
在这里插入图片描述这个周末做了一个题目,就是“求字符串变成回文字符串所需的最少字符数”。这个题目在去年我就见过,但是当时没有做出来,现在——也是借助了同学和网络的力量。解法就是:先求出该字符串与其逆序所变成的字符串的最长公共子序列,然后用原字符串的长度减去上面的值就是所得的解了。

<!DOCTYPE html>
<html>
<head>
    <title>求变成最短回文串的添加字符数</title>
    <script>
        function out() {
            //根据在网上查找的“求两个字符串的最长的公共子序列的动态规划方法”所想出来的
            var a1 = "1243543";
            var a2 = "";
            var b1 = new Array();       //定义一个二维数组
            for (var i = 0; i < a1.length; i++)
            {
                b1[i] = new Array();
                for(var j = 0;j < a1.length;j++)
                {
                    b1[i][j] = 0;
                }
            }
            for(var i = a1.length - 1;i >= 0;i--)
            {
                a2 += a1[i];
            }
            for(var i = 0;i < a1.length;i++)
            {
                for(var j = 0;j < a1.length;j++)
                {
                    if(a1[i] == a2[j])      //如果字符相同
                    {
                        if(i == 0)      //如果是第一排
                        {
                            if(j == 0)      //如果是第一列
                            {
                                b1[i][j] = 1;
                            }
                            else if (j != 0)      //如果不是第一列
                            {
                                b1[i][j] = b1[i][j - 1] + 1;
                            }
                        }
                        else if(i != 0)     //如果不是第一排
                        {
                            if(j == 0)      //如果是第一列
                            {
                                b1[i][j] = b1[i - 1][j] + 1;
                            }
                            else if (j != 0)      //如果不是第一列
                            {
                                b1[i][j] = (b1[i - 1][j] > b1[i][j - 1] ? (b1[i - 1][j] + 1) : (b1[i][j - 1] + 1));
                            }
                        }
                    }
                    else if (a1[i] != a2[j])      //如果字符不同
                    {
                        if (i == 0)      //如果是第一排
                        {
                            if (j == 0)      //如果是第一列
                            {
                                b1[i][j] = 0;
                            }
                            else if (j != 0)      //如果不是第一列
                            {
                                b1[i][j] = b1[i][j - 1];
                            }
                        }
                        else if (i != 0)      //如果不是第一排
                        {
                            if (j == 0)      //如果是第一列
                            {
                                b1[i][j] = b1[i - 1][j];
                            }
                            else if (j != 0)      //如果不是第一列
                            {
                                b1[i][j] = (b1[i - 1][j] > b1[i][j - 1] ? (b1[i - 1][j]) : (b1[i][j - 1]));
                            }
                        }
                    }
                }
            }
            alert(a1.length - b1[a1.length - 1][a1.length - 1]);
        }
    </script>
</head>
<body>
    <input type="button" value="输出结果" onclick="out()" />
</body>
</html>

这是写在了网页上,其实用其他语言也可以。如果要修改所要求的字符串,只要在"var a1 = "1234543""的引号里面改变数据即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值