自上次打卡中间断了,确实自己也很不爽,但学校诸事缠身,为何我眼中常含泪水?因为我不知道其他卷王是怎么做到那么高效率的,所以既然暂时不能拿捏优秀,起码做一个坚持到屑。
概念👏
所谓回文串,就是字符串反转以后和原串相同,如 abba 和 lippil。对于回文串还是比较容易去验证的,从字符数组的两端开始向中间靠拢去验证字符是否相等,但这里是否需要考虑字符数组长度的奇偶性呢?其实是不用的,下面一起来看看:
Leetcode链接:
1.回文串的验证 2.有效回文 3.回文排列
(1,2题是一样的,合并讲解吧)
点杀👏
先讲回文排列吧,简单一点。首先我们的思路要清楚,无非就是找出相同的字符并统计他出现的次数,我们保证每个字符只能出现偶数次,最多允许一个字符出现奇数个(奇数位字符串的中间元素) 代码如下:
char Func(char* s)
{
int i, count = 0;
int a[128] = { 0 };
int sz = strlen(s);
for (i = 0; i < sz; i++)
{
a[s[i]]++;
}
for (i = 0; i < 128; i++)
{
if (a[i] % 2 == 1)
count++;
if (count >= 2)
return false;
}
return true;
}
注意,这里面有一些重要细节:
1.数组 s 为 char 类型,字符数组在内存中存储方式是ASCII码值,s[ i ]就是在一一列举其中元素,假如我收到一个 ‘ a ’,a以ASCII码值作为下标++,第二个‘ a ’找到后依然是用相同的ASCII码值作为下标再++;这就是我统计数组中相同元素的次数的原理。 2. 数组初始化 a [128]不能更改是因为ASCII码值一共是128个,0~127。 ==3.==强调最多一位为奇数次出现的字符的特殊情况。
|