【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

简介: 【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )

文章目录

一、双指针算法分类

二、相向双指针示例 ( 有效回文串 )





一、双指针算法分类


面试时经常遇到 限制算法复杂度为 O ( n ) O ( n )O(n) 的情况 , 就需要使用以下算法 :


双指针算法 : 设置两个指针 ( 索引 ) , 进行不同方式的遍历 , 使用最高频的算法 ;

打擂台算法 : 设置一个擂主值 , 设置为无穷大或无穷小 , 通过遍历让该擂主值与遍历值打擂台 ; 求最大值最小值常用 ;

单调栈算法 ;

单调队列算法 ;


双指针算法分类 :


相向双指针 : 判断一个字符串是否是回文串 , 从两边向中心遍历 ;

背向双指针 : 查找一个字符串的最长回文子串使用的 " 中心线枚举算法 " 就是背向双指针算法 , 从中心向两边遍历 ; ( 出现频率较 - 低 )

同向双指针 :


相向双指针算法分类 :


翻转类型 : ① 翻转字符串 , ② 判断回文串 ; 两个指针分别指向收尾 , 两边往中间走 , 对比两个指向的元素是否相等 ;

两数之和型 : ① 两数之和 , ② 三数之和 ;

分割类型 : ① 快速排序 , ② 颜色排序 ; 给定一个数组 , 将其分割成两部分 , 一部分满足某条件 , 另外一部分不满足某条件 ;





二、相向双指针示例 ( 有效回文串 )


有效回文串 : https://www.lintcode.com/problem/415/


image.png



如果是不忽略大小写 , 特殊字符的情况 , 可以直接 翻转字符串 , 然后对比是否相等 ;

但是如果添加了上述要求 , 就需要处理大小写 , 特殊字符问题 , 有两种方案 :


创建新字符串 , 过滤掉大小写及特殊字符干扰, 然后翻转字符对比 , 这样会增加额外空间开销 ;

推荐使用双指针算法 , 一边进行过滤 , 一边进行对比 ;

设计两个指针 , 分别指向字符串的最左侧 和 最右侧 ;


每次遍历 , 都要进行 两个指针的下标判断 , 否则就会导致下标访问越界 ;



代码示例 :


public class Solution {
    /**
     * @param s: 一个字符串
     * @return: 该字符串是否有有效回文串
     */
    public boolean isPalindrome(String s) {
        if (s == null) {
            return false;
        }
        // 双指针
        int left = 0, right = s.length() - 1;
        while (left < right) {
            // 左指针向右移动, 一直移动, 直到遇到一个合法的字符, 即字母或数字
            while (left < right && !isValid(s.charAt(left))) {
                left ++;
            }
            // 右指针向左移动, 一直移动, 直到遇到一个合法的字符, 即字母或数字
            while (left < right && !isValid(s.charAt(right))) {
                right --;
            }
            // 对比两个指针指向的字符, 如果不相等, 则说明该字符串不是有效回文串
            if (left < right && !isEqual(s.charAt(left), s.charAt(right))) {
                return false;
            }
            // 两指针相向移动
            left++;
            right--;
        }
        return true;
    }
    /**
     * 判定字符串是否是字母或数字
     * @param c 被判定的字符串
     * @return 是否是字母或数字
     */
    private boolean isValid(char c) {
        return Character.isLetter(c) || Character.isDigit(c);
    }
    /**
     * 对比两个字符是否相等, 忽略大小写, 先将字符转为小写字母, 然后再对比
     * @param a 对比的字符一
     * @param b 对比的字符二
     * @return 字符转为小写字母后, 是否相等
     */
    private boolean isEqual(char a, char b) {
        return Character.toLowerCase(a) == Character.toLowerCase(b);
    }
}
class Main{
    public static void main(String[] args) {
        boolean isPalindrome = new Solution().isPalindrome("A man, a plan, a canal: Panama");
        System.out.println(isPalindrome);
    }
}

image.png

目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
98 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
存储 缓存 分布式计算
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
这篇文章是关于数据结构与算法的学习指南,涵盖了数据结构的分类、数据结构与算法的关系、实际编程中遇到的问题以及几个经典的算法面试题。
37 0
数据结构与算法学习一:学习前的准备,数据结构的分类,数据结构与算法的关系,实际编程中遇到的问题,几个经典算法问题
|
3月前
|
算法 索引 容器
双指针算法详解
本文介绍了双指针算法及其应用。双指针算法是在数组或字符串中常用的高效技术,通过维护两个指针遍历数据结构以解决特定问题。根据指针移动方向,可分为同向双指针、相向双指针和快慢指针。同向双指针如移动零和复写零问题;快慢指针如快乐数问题;相向双指针如盛水最多的容器、有效三角形数量及多数之和等问题。通过合理运用双指针技巧,可简化代码并提高效率。
65 4
双指针算法详解
|
2月前
|
移动开发 算法 前端开发
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
前端常用算法全解:特征梳理、复杂度比较、分类解读与示例展示
26 0
|
3月前
|
机器学习/深度学习 算法 数据挖掘
决策树算法大揭秘:Python让你秒懂分支逻辑,精准分类不再难
【9月更文挑战第12天】决策树算法作为机器学习领域的一颗明珠,凭借其直观易懂和强大的解释能力,在分类与回归任务中表现出色。相比传统统计方法,决策树通过简单的分支逻辑实现了数据的精准分类。本文将借助Python和scikit-learn库,以鸢尾花数据集为例,展示如何使用决策树进行分类,并探讨其优势与局限。通过构建一系列条件判断,决策树不仅模拟了人类决策过程,还确保了结果的可追溯性和可解释性。无论您是新手还是专家,都能轻松上手,享受机器学习的乐趣。
49 9
|
2月前
|
算法 C++
【算法】双指针+二分(C/C++
【算法】双指针+二分(C/C++
|
4月前
|
存储 算法 安全
密码算法的分类
【8月更文挑战第23天】
111 0
|
4月前
|
算法 容器
【算法】双指针
【算法】双指针
|
2月前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。