leetcode 算法 409 最长回文数

这个题目要求我们在给出的字符串中找到最长的回文数,先上代码:

int longestPalindrome(char* s) {
    int vb[128] = {0};
    int count = 0;
    int l = strlen(s);

    // 遍历字符串,记录每一个字符出现的次数
    for ( int i=0; i < l; i++ ) {
        vb[s[i]]++;
    }
 
    // 遍历 定义的计数的数组
    for ( int i=0; i< 128; i++ ) {
        count += vb[i] - (vb[i] % 2);    // 如果该字符出现的次数为奇数次,就减一再加
    }

    return count +( count != strlen(s) ) ;  // 最后返回的是 最长的字符串长度
}

对于如何找到最长的回文字符串要分为两种情况,一种是偶数,另一种就是奇数

那么我们就要搞清楚如果这个字符出现的次数为偶数时该怎么处理,而出现的次数为奇数次时又该怎么处理

这里我们对于偶数次的字符直接采取不处理,直接加和的原则,因为要求回文串,所以偶数次的字符并不需要处理

但是奇数次的字符就要进行额外的处理,因为当奇数次的字符出现时,我们必须要保证整个字符串中只有一个字符出现的次数为奇数次。也就是说,当出现了n种奇数次的字符时,返回的长度就是原长 - n + 1

所以在上述的代码中,我们在遍历vb数组时,计算count的数值要对该字符个数进行取余再减去余数的操作,这样对于偶数来说相当于没有处理,但是对于奇数来说就是进行了减一的操作

但是这样遍历出来的count数值始终时 原长 - n , 而不是 原长 - n + 1  。

所以在返回最终的结果时,进行一个比较的操作,当count数值 不等于 原长时,证明该数组中有奇数次的字符出现,那么令上述的不等式结果为 1 ,就可以保证最终保留了一个奇数次的字符,就是最终的字符串长度了。

简单来讲就是,把原来字符串中的所有字符出现的次数全部转化成偶数,再保证出现了奇数次的字符只保留一个,就是最终的回文串长度了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值