当前位置: 首页 > news >正文

两字符串拼接形成回文串

leetcode336. 回文对

给定一组 互不相同 的单词, 找出所有 不同 的索引对 ( i , j ) (i, j) (i,j),使得列表中的两个单词, w o r d s [ i ] + w o r d s [ j ] words[i] +words[j] words[i]+words[j] ,可拼接成回文串。
提示:

  • 1 <= words.length <= 5000
  • 0 <= words[i].length <= 300
  • words[i] 由小写英文字母组成

思路

选取一个字符串 s s s,将其分成两个部分 l e f t left left, r i g h t right right,若存在一个字符串 s ′ s' s满足 r i g h t right right是回文串且 s ′ s' s的翻转等于 l e f t left left,那么 s + s ′ s+s' s+s是回文串。同样的若 l e f t left left是回文串且且 s ′ s' s的翻转等于 r i g h t right right,那么 s ′ + s s'+s s+s也是回文串。所以可以先预处理出来所有字符串的翻转字符串,那么判断 l e f t left left r i g h t right right是否存在 s ′ s' s是其翻转的时间复杂度为 O ( 1 ) O(1) O(1)。枚举 l e f t left left长度的时间复杂度为 O ( l ) O(l) O(l),判断 l e f t left left r i g h t right right是否回文时间复杂度为 O ( l ) O(l) O(l)。所以总体的时间复杂度为 O ( n l 2 ) O(nl^2) O(nl2),其中 n n n是字符串个数, l l l是字符串长度。数据有点弱,可以通过

代码

class Solution {
    public List<List<Integer>> palindromePairs(String[] words) {
        int n = words.length;
        Map<String,Integer> map = new HashMap<>();
        for(int i = 0; i < n; i++) {
            String s = words[i];
            String ss = new StringBuilder(s).reverse().toString();
            map.put(ss, i);
        }
        List<List<Integer>> res = new ArrayList<>();
        for(int i = 0; i < n; i++) {
            String s = words[i];
            if(s.length() == 0) {
                continue;
            }
            for(int j = 0; j <= s.length(); j++) {
                String left = s.substring(0,j), right = s.substring(j);
                if(check(right) && map.get(left) != null && map.get(left) != i) {
                    List<Integer> tmp = new ArrayList<>();
                    tmp.add(i); tmp.add(map.get(left));
                    res.add(new ArrayList<>(tmp));
                }
                if(j != 0 && check(left) && map.get(right) != null && map.get(right) != i) {
                    List<Integer> tmp = new ArrayList<>();
                    tmp.add(map.get(right)); tmp.add(i); 
                    res.add(new ArrayList<>(tmp));
                }
            }
        }
        return res;
    }

    public boolean check(String s) {
        int l = 0, r = s.length() - 1;
        while(l < r) {
            if(s.charAt(l) != s.charAt(r)) {
                return false;
            }
            l++; r--;
        }
        return true;
    }
}

相关文章:

  • linux中 删除指定行多行sed命令
  • Worthington公司氨基酸氧化酶,L-的特异性分析
  • Phoenix Digital网络模块——将新的PLC连接到传统远程I/O
  • 剑指offer之树专题
  • 单声道D类音频功率放大器 CS8683H 特点及应用
  • 算法刷题第三天:双指针--2
  • 技术分享 | 被测项目需求你理解到位了么?
  • 宿主物种丨Jackson告诉你选择二抗的注意事项
  • centos8安装cobbler3.2
  • 网络编程-----socket函数
  • SpringBoot的自动装配进阶
  • 高通平台Android 蓝牙调配置手试和册-- OPP File Transmission Failure
  • STC15单片机内部RAM讲解
  • zemax---Ray Aberration(光线光扇图)
  • Polygon zkEVM Arithmetic状态机
  • 3.7、@ResponseBody 和 @RestController
  • 77. Combinations
  • CSS相对定位
  • Github访问慢解决办法
  • Logstash 参考指南(目录)
  • 复习Javascript专题(四):js中的深浅拷贝
  • 基于axios的vue插件,让http请求更简单
  • 简析gRPC client 连接管理
  • 精彩代码 vue.js
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 追踪解析 FutureTask 源码
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​油烟净化器电源安全,保障健康餐饮生活
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #传输# #传输数据判断#
  • $.proxy和$.extend
  • (AngularJS)Angular 控制器之间通信初探
  • (WSI分类)WSI分类文献小综述 2024
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (一)UDP基本编程步骤
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转)C#调用WebService 基础
  • (转)可以带来幸福的一本书
  • .gitignore文件_Git:.gitignore
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET 服务 ServiceController
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET6 开发一个检查某些状态持续多长时间的类
  • .NetCore Flurl.Http 升级到4.0后 https 无法建立SSL连接
  • .netcore如何运行环境安装到Linux服务器