青藤工作室在本周进行了第一次面试,简单说了一下寒假作业,进行了简短的交流。然后综观所有,找出了一些特别好看的作品给我们参观,网址为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""的引号里面改变数据即可。