入门级算法练手--字符串--验证回文串、(每日两题2019-09-18)

本文深入探讨了验证回文串及判断字母异位词的有效算法,包括筛选非字母数字字符、忽略大小写差异的技巧,以及使用哈希表解决字母异位词问题的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、验证回文串

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

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

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:

输入: "race a car"
输出: false

这个题目首先看到感觉有点简单,但其实上手还是比较复杂的。我们要筛选掉不是字母和数字的,其次将大写字母转为小写字母(因为题目忽略大小写,所以最好统一一下),最后才能进行比较。但是这个回文串的形式跟我们平常见到的不太一样,这个回文串他不一定是对称的,因此不能用平常的验证方法来做。一个最简单的方法就是将原串中的字母 和数字单独提取出来,大写转换为小写,重新放在一个新的字符串中,然后对这个新的字符串就可以按照我们平常的方式(对称比较法)来判断了;另一种方法是将提取出来的新串倒序放在另一个串里,比较这两个串的异同,但是比较吃内存,Java的话直接reverse函数放在stringbuffer里就可以了。当然毕竟是算法,除了这些之外,还有一个比较简单的算法,就是利用快排的思想。

因为这个回文串可能不是对称的,而且需要前后比较,我们就考虑到了用两个游标,一个在前,一个在后,如果两端的字符不是数字或字母,左边游标右移,右边左移,跟快排的思想一样的,当然实现起来的代码也相同。判断完之后将大写换小写,随后进行比较即可。

两个小知识点,位运算的方法转换大小写:

                统一转成大写:ch & 0b11011111 简写:ch & 0xDF

                统一转成小写:ch | 0b00100000 简写:ch | 0x20 

2. 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"
输出: true
示例 2:

输入: s = "rat", t = "car"
输出: false
说明:
你可以假设字符串只包含小写字母。

这个题应该很熟悉,昨天发的两个题跟这个完全是一个考点,有效字母的异位词就是这两个单词是不是由相同个数的相同字母组成的,又用到了字符串的字母个数问题---------哈希表!!!!



bool isAnagram(char * s, char * t){
    int len_s = strlen(s);
    int len_t = strlen(t);
    int num_s[26]={0},num_t[26]={0};
    if(len_s!=len_t) return false;//长度不同 一定不是异位词
    for(int i=0;i<len_s;i++){
        num_s[s[i]-'a']++;
    }
    for(int i=0;i<len_t;i++){
        num_t[t[i]-'a']++;
    }
    for(int i=0;i<26;i++){
        if(num_s[i]!=num_t[i]) return false;
    }
    return true;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值