回文 - 回文的性质

回文的性质

以前,一看到回文这两个字我就头大。记得有一次去面试的时候,我看到回文,脑子一片空白(PS: 菜的呀 TvT )。前两天松鼠做了回文的问题,他说其实掌握了回文的性质其实还好。我一听,对!问题的关键在于要先把性质梳理一下,之后很多问题就迎刃而解了!接下来,我们就一步步来吧!

回文定义 - Palindrome

一个数字或者字符串正读/反读都一样,例如,1221,123454321,“abcdcba”等等。

首先,给大家一个判断String是否为回文的算法。

public boolean isPalindrome(String s, int left, int right) {
    int len = right - left + 1;
    for (int i = 0; i < len / 2; i++) {
        if (s.charAt(left + i) != s.charAt(right - i)) return false;
    }
    return true;
}

另外,给大家一个反转String的快捷方法—— new StringBuffer(s).reverse().toString()。在回文的处理中,我们经常要做反转。

之后,是判断数字是否为回文的算法。这里利用了回文的性质,数字的逆向排列还与它本身相等。

public boolean isPalindrome(int x) {
    if (x < 0) return false;
    return x == reverse(x);
}

public int reverse(int x) {
    int rev = 0;
    while (x != 0) {
        rev = rev * 10 + (x % 10);
        x = x / 10;
    }
    return rev;
}

回文的性质与练习

1. 回文数的reverse还等于它本身。

2. 回文数的表示方式,“xyyx” = x * 1000 + y * 100 + y * 10 + x * 1 = 1001 * x + 110 * y。通过数论的有关知识,可知xyyx一定能被11整除,一定不是素数。同理,六位数和八位数的回文数也都不是素数。LeetCode传送门——回文素数 。

3. 回文根,假设有一个d长度的回文数,那么这个数的前(d+1)/2是这个数字的回文根。例如,12321的回文根是123,而1221的回文根是12。通过这样的方式,可以从 1~9,10~99,100~999,...作为回文根构造出所有的回文数。比如以10作为回文根的奇数回文是101,偶数回文是1001。

4. 能够组成回文的字符中,含有奇数个字符的只有一个。比如['a', 'a',  'c', 'd']无法组成回文字符串,因为c和d的个数均为奇数,而['a', 'a', 'c']则可以因为只有c的个数为奇数。LeetCode传送门——回文排列 。

5. 对于能够组成回文的两个字符串s1和s2,不妨设s1.length() > s2.length()。s1可以被拆分成两个部分t1和t2,其中,t2也是一个回文,t1则是s2的反向排列,并且有t1.length() = s2.length()。例如,现有字符串s1=“abcbab”和s2=“cba”,而s1可以拆成t2 = "bab"和与s2等长的t1="abc"。LeetCode传送门——回文对

6. 回文分为两种,奇数个数的回文和偶数个数的回文,可以通过对两边每次增加一个相同字母的方式进行构造。比如,“a” ==> "bab",“cc” ==> "dccd"。LeetCode传送门——回文子串

7. 回文正向计算哈希值和反向计算得到的哈希值是相等的,在哈希算法可靠的情况下,可以通过正向和反向计算哈希值判断这个字符串是否是一个回文。这给了我们判断回文的另外一种方式,通过它我们可以判断子串中回文的数量。LeetCode传送门——最短回文串 。 

希望对大家有帮助!

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值