C#LeetCode刷题之#125-验证回文串(Valid Palindrome)

本文介绍了一种验证字符串是否为回文串的算法,重点讨论了两种不同的实现方式:一种通过反转字符串进行比较,另一种利用List进行高效比对。通过实例演示了不同算法的输出结果及性能分析。

问题

 

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 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种算法的时间复杂度均为: O(n) 。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值