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;
}