两字符串拼接形成回文串

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;
    }
}
字符串是计算机科学中重要的数据类型之一。字符串是由字符组成的有限序列,可以用来表示文本、数字等数据。字符串可以进行一些基本的运算,如连接、截取、替换、查找等。此外,字符串还具有一些特殊的性质,如回文、子序列等。 字符串连接是将个或多个字符串拼接在一起形成一个新的字符串。例如,"hello" 和 "world" 连接后形成 "helloworld"。字符串连接可以通过 "+" 运算符或字符串的 concat() 方法实现。 字符串截取是从一个字符串中取出一部分子串。例如,从字符串 "hello world" 中截取出 "world"。字符串截取可以通过字符串的 substring() 或 slice() 方法实现。 字符串替换是将一个字符串中的某些子串替换成另一个字符串。例如,将字符串 "hello world" 中的 "world" 替换成 "everybody"。字符串替换可以通过字符串的 replace() 方法实现。 字符串查找是在一个字符串中查找某个子串的位置。例如,在字符串 "hello world" 中查找 "world" 的位置。字符串查找可以通过字符串的 indexOf() 或 lastIndexOf() 方法实现。 递归算法是一种基于函数调用自身的算法。在递归算法中,问题会被逐步分解成更小的问题,直到问题变得足够简单,可以直接求解。递归算法通常需要定义递归基和递归步骤。递归基是问题的最小规模,递归步骤是问题的逐步分解。 递归算法可以用来解决许多问题,如数学上的阶乘、斐波那契数列等。在字符串处理中,递归算法可以用来实现一些操作,如字符串反转、最长公共子串等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值