【每日算法】删减字符获得最大回文符
2016-05-25 23:06
375 查看
题一:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。
例如:sleep 需要删除3个(’s’ ‘l’ ‘p’),剩下“ee”就是回文符。
google 需要删除2个(’l’ ‘e’),剩下“goog”。
我在C#上实现这个算法。下面做了个窗口运行,下面是运行截图:
如上图所示”google”,需要删除两个字符。
这个问题是要我们求删除的字符数,其实在另一方面是要我们求出最长的回文串,然后用原字符长度减去最长回文串长度就是要求的删除字符个数。
也就是说要求出最长回文串。
关于回文串
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
最初的想法是将字符串反转,所得的反转字符与原字符比较,求得最大的回文串。
最笨的办法是从两头开始循环比较。
以下是代码片段(最大回文串长度):
输出需要删除的字符个数。
例如:sleep 需要删除3个(’s’ ‘l’ ‘p’),剩下“ee”就是回文符。
google 需要删除2个(’l’ ‘e’),剩下“goog”。
我在C#上实现这个算法。下面做了个窗口运行,下面是运行截图:
如上图所示”google”,需要删除两个字符。
这个问题是要我们求删除的字符数,其实在另一方面是要我们求出最长的回文串,然后用原字符长度减去最长回文串长度就是要求的删除字符个数。
也就是说要求出最长回文串。
关于回文串
“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。
最初的想法是将字符串反转,所得的反转字符与原字符比较,求得最大的回文串。
最笨的办法是从两头开始循环比较。
以下是代码片段(最大回文串长度):
String s1 = str; String s2 = Reverse(str); int length = s1.Length; int[,] temp = new int[length+1, length+1]; /** * 这个无关紧要 */ for (int i = 0; i < length; i++) { for (int j = 0; j < length; j++) { temp[i, j] = 0; } } /** * 以下开始匹配 */ for (int i = 0; i < length; ++i) { for (int j = 0; j < length; ++j) { if (s1[i] == s2[j]) { temp[i + 1, j + 1] = temp[i, j] + 1; } else { temp[i + 1, j + 1] = Math.Max(temp[i, j + 1], temp[i + 1, j]); } } } return temp[length,length];
相关文章推荐
- c#调用COM组件
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法