问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3899 访问。

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

输入: "A man, a plan, a canal: Panama"

输出: true

输入: "race a car"

输出: false


Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

Note: For the purpose of this problem, we define empty string as valid palindrome.

Input: "A man, a plan, a canal: Panama"

Output: true

Input: "race a car"

Output: false


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3899 访问。

public class Program {

    public static void Main(string[] args) {
var s = "0P"; var res = IsPalindrome(s);
Console.WriteLine(res); s = "A man, a plan, a canal: Panama"; res = IsPalindrome2(s);
Console.WriteLine(res); Console.ReadKey();
} private static bool IsPalindrome(string s) {
//基本思路,反转字符串后判定和之前是否相同
//LeetCode超时未AC
s = FilterCharacter(s);
var reverse = "";
s.Reverse().ToList().ForEach(c => reverse += c);
return s == reverse;
} /// <summary>
/// 过滤非字母以外的字符串
/// </summary>
/// <returns>过滤后的字符串</returns>
/// <param name="s">待过滤的字符串</param>
private static string FilterCharacter(string s) {
var res = string.Empty;
s = s.ToLower().Trim();
s.ToList().ForEach(c => {
if((c >= 48 && c <= 57) ||
(c >= 97 && c <= 122)) res += c;
});
return res;
} private static bool IsPalindrome2(string s) {
//基本思路,先用List存放所有符合条件的字符
//再比较前半部分和后半部分
s = s.ToLower().Trim();
var list = new List<char>();
foreach(var c in s) {
if((c >= 48 && c <= 57) ||
(c >= 97 && c <= 122)) {
list.Add(c);
}
}
var mid = list.Count / 2;
for(var i = 0; i < mid; i++) {
if(list[i] != list[list.Count - i - 1]) return false;
}
return true;
} }

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3899 访问。

False
True

分析:

显而易见,以上2种算法的时间复杂度均为:  。

需要注意的是,虽然以上2种算法的时间复杂度相同,但是 IsPalindrome2 的执行效率明显更高,因为只有1.5次遍历,并且比较部分使用了效率较高的数据结构 List;IsPalindrome 有反转字符串和去除不合法字符的代码,所以至少需要遍历2次。IsPalindrome2 是典型的空间换时间算法。

最新文章

  1. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
  2. 【转】SQL删除重复数据方法,留着备用
  3. boldSystemFontOfSize 和 systemFontOfSize 的区别
  4. c#动态调用Webservices
  5. Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
  6. XML学习笔记(四)-- 修饰XML文档的CSS
  7. easyUI API(version 1.5)
  8. hdu 5167 Fibonacci 打表
  9. 3D Game Programming with directx 11 习题答案 8.3
  10. [AngularJS] ng-if vs ng-show
  11. iOS开发-本地存储(偏好设置,Plist,归档)
  12. 自学Zabbix11.5 Zabbix SNMP监控实例
  13. Python 入门基础20 --面向对象_继承、组合
  14. js20130114
  15. gojs 破解版
  16. git 恢复到旧版本命令
  17. 【SoapUI】比较Json response
  18. NPOI操作Excel文件
  19. TF卡和SD卡的区别
  20. Romantic---hdu2669(扩展欧几里德模板)

热门文章

  1. Windows下配置ChromeDriver
  2. Postman接口测试实战分享,这5个问题你必须得知道!【软件测试工程师经验分享】
  3. 手把手教你安装Office 2019 for Mac ,安装包和破解码都给你准备好了,还装不上的话,你找我!
  4. UVALive - 3644 X-Plosives (并查集)
  5. accpet和connect设置超时
  6. Oracle可视化工具连接
  7. 更改docker默认存储路径操作(centos6版本)
  8. android手机号和密码输入框的一个范例
  9. Html5 表单元素基础
  10. Redis一站式管理平台工具,支持集群创建,管理,监控,报警