`

Palindrome总结

阅读更多
这篇文章总结leetcode中回文的题目,其中关于palindrome partition有两道题目,第二道属于动态规划的题目,我们动态规划的总结中讨论。简单的讲回文就是将它翻转后和原来一样。

1,Palindrome Number
给定一个数字,判断它是否为回文数。

对于数字来讲,负数不属于回文数,对于正数,我们将它逆转,然后与原始值比较,如果相等就为回文数。代码如下:
public class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0) return false;
        int result = 0;
        int tem = x;
        while(x != 0) {
            result = result * 10 + x % 10;
            x /= 10;
        }
        if(result == tem)
            return true;
        return false;
    }
}


2,Valid Palindrome
给定一个字符串判断是否为回文,只考虑数字和字母,并且不考虑字母大小写问题。
例如:"A man, a plan, a canal: Panama" 是回文字符串
"race a car" 不是回文字符串

既然只考虑数字和字母,我们就要想办法把其它的字符去除,这里我们用到正则表达式来处理,我们替换掉除字母和数字以外其它的字符,正则表达式为[^0-9a-z-A-Z],代码如下:
public class Solution {
    public boolean isPalindrome(String s) {
        s = s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
        int l = 0;
        int r = s.length() - 1;
        while(l < r) {
            if(s.charAt(l) != s.charAt(r)) {
                return false;
            } else {
                l ++;
                r --;
            }
        }
        return true;
    }
}


3,Palindrome Linked List
给定一个链表,判断是否为回文链表。

解决这道题我们要用快慢指针,找到中间点,接下来我们可以用栈操作,把前半段压入到堆栈中,然后和后半段比较;也可以将后半段反转与前半段进行比较。注意的问题是用堆栈的时候要考虑链表元素个数为奇数还是偶数。

堆栈解法:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isPalindrome(ListNode head) {
        Stack<Integer> stack = new Stack<Integer>();
        if(head == null) return true;
        ListNode fast = head;
        ListNode slow = head;
        while(fast.next != null && fast.next.next != null) {
            stack.push(slow.val);
            slow = slow.next;
            fast = fast.next.next;
        }
        head = slow.next;
        
        // 对奇偶数的判断
        if(fast.next != null)
            stack.push(slow.val);
        
        //比较前后半段
        while(!stack.isEmpty()) {
            if(stack.pop() != head.val){
                return false;
            } else {
                head = head.next;
            }
        }
        return true;
    }
}


反转解法:
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null) return true;
        ListNode fast = head;
        ListNode slow = head;
        //得到中间节点
        while(fast.next != null && fast.next.next != null) {
            slow = slow.next;
            fast = fast.next.next;
        }
        fast = head;
        head = slow.next;
        
        //反转后半段
        ListNode pre = null;
        ListNode tem = null;
        while(head != null) {
            tem = head.next;
            head.next = pre;
            pre = head;
            head = tem;
        }
        
        //比较前半段与后半段
        while(pre != null) {
            if(fast.val != pre.val) {
                return false;
            } else {
                fast = fast.next;
                pre = pre.next;
            }
        }
        return true;
    }
}


4,Palindrome Partitioning
给定一个字符串s,把s分为很多子串,每个子串都为回文字符串,列出所有可能的结果。
例如:给定s = "aab"
输出: [ ["aa","b"],  ["a","a","b"] ]

因为要列出所有的结果,很容易想到用回溯法。代码如下:
public class Solution {
    public List<List<String>> partition(String s) {
        List<List<String>> llist = new ArrayList<List<String>>();
        LinkedList<String> list = new LinkedList<String>();
        if(s == null) return llist;
        partitionPalindro(0, s, llist, list);
        return llist;
    }
    public void partitionPalindro(int start, String s, List<List<String>> llist, LinkedList<String> list) {
        if(start == s.length()) {
            llist.add(new LinkedList<String>(list));
            return;
        }
        for(int i = start; i < s.length(); i++) {
            if(isPalindrom(s.substring(start, i + 1))) {
                list.add(s.substring(start, i + 1));
                partitionPalindro(i + 1, s, llist, list);
                list.removeLast();
            }
        }
    }
    
    private boolean isPalindrom(String s) {
        int l = 0;
        int r = s.length() - 1;
        while(l < r) {
            if(s.charAt(l) != s.charAt(r)) {
                return false;
            } else {
                l ++;
                r --;
            }
        }
        return true;
    }
}
分享到:
评论

相关推荐

    LeetCode9 Palindrome Number

    总结来说,LeetCode第9题“回文数”是一道考验逻辑思维和编程技巧的题目,其Java实现既可以直接翻转数值,也可以利用位运算。理解并掌握这些方法,对于提高我们的算法能力大有裨益。在编程实践中,不断挑战类似的...

    回文数(Palindrome)是指一个正整数从前往后读和从后往前读是完全相同的数,例如 121、1331、1001 等 回文

    #### 总结 以上介绍的方法可以有效地找出一定范围内的所有回文素数。需要注意的是,对于非常大的数,素数检测可能会变得非常慢。在这种情况下,可以考虑使用更高效的素数检测算法,如Miller-Rabin算法或Lucas-...

    回文实验代码 回文实验

    总结来说,"回文实验代码"是一个很好的学习资源,它覆盖了字符串处理、基本算法、数据结构和优化技巧等多个方面,适合编程初学者和进阶者作为练习和提高技能的材料。通过分析和实现这些代码,我们可以深化对编程语言...

    Palindrome:查找数字中最近的较大回文

    总结来说,这个Java应用程序的核心是使用Java 8的特性,如lambda表达式和Stream API,来解决寻找给定数字最近的较大回文数的问题。通过学习这个案例,你可以提升对Java 8新特性的理解和应用能力,同时也可以掌握如何...

    python判断回文数-36-函数二总结.ev4.rar

    这个压缩包文件"python判断回文数-36-函数二总结.ev4.rar"很可能包含了一个关于如何使用Python来检测一个数是否为回文的教程或示例。从文件名推测,这个资源可能是一个视频教程,讲解了至少两种不同的方法来实现这个...

    js代码-9. Palindrome Number

    总结,理解并实现回文数的检测不仅有助于提升基础编程技能,还能加深对JavaScript数据类型和操作的理解。不论是字符串操作还是数学运算,这两种方法都展示了JavaScript在处理数字和字符串时的灵活性。通过实践和调试...

    poj题目类型总结(每题用到的算法)

    - **1159 (Palindrome)**:这道题考察的是字符串处理中的回文串判断,可以通过中心扩展法或Manacher算法求解。 - **1141 (Brackets Sequence)**:本题要求判断括号序列是否有效,可以用栈来实现高效的判断。 ### 6....

    python回文素数.rar

    总结来说,Python处理回文素数涉及到的主要知识点包括: 1. 回文数的判断:通过字符串反转实现。 2. 素数的判断:使用质因数分解或简单的试除法。 3. 回文素数的查找:结合回文和素数的判断,遍历特定范围的数字。 4...

    Palindrome-Check:一个简单的Java程序,用于检查用户输入的单词或短语以检查其是否是回文

    总结来说,"Palindrome-Check"是一个教育性和实用性的Java程序,它可以帮助初学者掌握字符串处理和用户交互的基本技巧,同时也是一个展示基础编程概念和问题解决能力的实例。通过分析和修改这个程序,开发者可以增强...

    基于python判断回文字符串.pptx

    总结来说,Python中判断回文字符串的关键在于字符串的预处理和比较操作。通过预处理去除无关字符并转换为统一格式,然后比较原字符串和其反转是否一致,即可确定字符串是否为回文。这个过程可以被封装成一个简洁、...

    leetcode338-LeetCode:LeetCode刷题总结

    LeetCode刷题总结 1.Two Sum 2.Add Two Numbers 3.Longest Substring Without Repeating Characters 4.Median of Two Sorted Arrays 5.Longest Palindromic Substring (Manacher算法待完成) 6.ZigZag Conversion 7....

    java实现回文数.md

    ### Java 实现回文数 ...#### 总结 本文详细介绍了使用Java实现回文数的方法,特别是通过反转数字的方式来进行判断。这种方法简单直观,易于理解和实现。通过这种方式,可以有效地判断一个数字是否具备回文的特性。

    C语言抽象的字符串回文判断源程序

    #### 总结 本程序提供了一种较为复杂的方式来判断字符串是否为回文,通过逐个字符的比较,确保了即使包含非字母字符也能正确判断。这种方式不仅展示了C语言的强大功能,而且对于学习者来说,也是理解指针、字符串...

    10个最常见的Java算法.doc

    Java 算法基础知识点总结 本文总结了 Java 中 10 个最常见的算法类型,涵盖了字符串、数组、链表、树形结构等多种数据结构。这些算法是程序员在代码面试中最常遇到的问题,了解这些算法的原理对程序员的职业生涯...

    JAVA第十版部分答案

    JAVA基础知识点总结 JAVA是Sun Microsystems公司推出的一个高级的、基于对象的编程语言,具有跨平台、面向对象、分布式处理和动态的特点。下面是根据给定的文件信息所总结的知识点: 一、Java基础语法 * Java程序...

    java代码-https://leetcode-cn.com/problems/prime-palindrome/submissions/ 866. 回文素数

    总结来说,这个Java代码示例展示了如何利用基本的数学和字符串操作来解决一个结合了回文和素数性质的编程问题。通过这个例子,我们可以学习到如何在实际编程中运用这些概念,并理解如何优化算法以提高效率。

    leetcode-回文数,回文串(非dp,排序问题哈,dp太难,以后再总结)

    266:https://leetcode-cn.com/problems/palindrome-permutation/ 题目: 思路:判断能否形成回文串,那只要数奇数个字符的种类是否大于2,大于2肯定不可以形成 代码: 409:...

    Java回稳数的实验

    在本Java实验中,我们将探讨一个重要的编程概念——回文数。回文数是指一个正向读和反向读都一样的数字,例如121、12321等。...记得在完成实验后,及时总结和反思,这将有助于你在编程之路上不断进步。

    Palindromo-React:使用CodeSandbox创建

    总结起来,"Palindromo-React"项目利用了CodeSandbox的便捷特性,展示了如何创建一个简单的React应用,用于检测回文字符串。通过这个过程,我们学习了React组件的创建、状态管理和事件处理,以及如何在CodeSandbox中...

Global site tag (gtag.js) - Google Analytics