zoukankan      html  css  js  c++  java
  • 双指针算法

    1. 验证回文字符串

    题目

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

    说明:本题中,我们将空字符串定义为有效的回文串。

    示例 1:

    输入: "A man, a plan, a canal: Panama"
    输出: true
    示例 2:

    输入: "race a car"
    输出: false

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-palindrome
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    双指针算法的基本应用,从两边向中心移动,遇到不符条件的字符跳过。

    代码

    class Solution {
        public boolean isPalindrome(String s) {
            if(s == null || s.length() == 0){
                return true;
            }
            int left = 0, right = s.length() - 1;
            while(left < right){
                while(left < right && !Character.isLetter(s.charAt(left)) && !Character.isDigit(s.charAt(left))) {
                    left++;
                }
                while(left < right && !Character.isLetter(s.charAt(right)) && !Character.isDigit(s.charAt(right))) {
                    right--;
                }
                if(left < right && Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){
                    return false;
                }
                left++;
                right--;
            }
            return true;
        }
    }

    2. 验证回文字符串II

    题目

    给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

    示例 1:

    输入: "aba"
    输出: True
    示例 2:

    输入: "abca"
    输出: True
    解释: 你可以删除c字符。
    注意:

    字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/valid-palindrome-ii
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    从左右两端开始验证是否是回文串,验证的过程中,若两个字符不等,再左右各加一或减一,验证一遍。

    代码

    class Solution {
        public boolean validPalindrome(String s) {
            if(s == null || s.length() == 0){
                return true;
            }
            int left = 0, right = s.length() - 1;
            while(left < right){
                if(s.charAt(left) != s.charAt(right)){
                    break;
                }
                left++;
                right--;
            }
            if(left >= right) return true;
            
            return isPalindrome(s, left + 1, right) || isPalindrome(s, left, right - 1);
        }
    
        public boolean isPalindrome(String s, int left, int right) {
            while(left < right){
                if(s.charAt(left) != s.charAt(right)){
                    return false;
                }
                left++;
                right--;
            }
            return true;
        }
    }
  • 相关阅读:
    Attributes in C#
    asp.net C# 时间格式大全
    UVA 10518 How Many Calls?
    UVA 10303 How Many Trees?
    UVA 991 Safe Salutations
    UVA 10862 Connect the Cable Wires
    UVA 10417 Gift Exchanging
    UVA 10229 Modular Fibonacci
    UVA 10079 Pizza Cutting
    UVA 10334 Ray Through Glasses
  • 原文地址:https://www.cnblogs.com/DarrenChan/p/11533967.html
Copyright © 2011-2022 走看看