每日一题算法:2020年8月6日 [回文对] palindromePairs

2020年8月6日 回文对 palindromePairs

在这里插入图片描述

class Solution {
    public List<List<Integer>> palindromePairs(String[] words) {

    }
}

解题思路:

刚看到这题,思考了3、4分钟没有想到什么好的解决方案,只好先尝试使用暴力算法,暴力算法的时间复杂度非常高,不过在编写算法的过程中可能会有新的思路。

暴力算法:

在这里插入图片描述

public List<List<Integer>> palindromePairs(String[] words) {
    int len=words.length;
    List<List<Integer>> res=new LinkedList<>();
    for(int i=0;i<len;i++){

        for (int j=0;j<len;j++){

            if (j==i)
                continue;

            if (isPalindrome(words[i],words[j])){
                LinkedList<Integer> lis=new LinkedList<>();
                lis.add(i);
                lis.add(j);
                res.add(lis);
            }

        }

    }
    return res;
}
public boolean isPalindrome(String word1,String word2){

    String s=word1+word2;
    for (int i=0,j=s.length()-1;i<j;i++,j--){
        if (s.charAt(i)!=s.charAt(j))
            return false;
    }
    return true;
}

进阶,优化

优化的方向目前有两个

1:比较回文串是否必须要遍历所有字符?

2:回文串之间是否存在逻辑关系,比如A和B能组成回文串,B和C能够组成回文串,那么AC之间存在什么关系吗?

第一个问题,貌似是必须的

第二个问题,貌似也没有逻辑关系,可以举出反例

A和B能组成回文 A=“a” B=“aa”

A和C能组成回文 A=“a” C=“aaa”

此时B和C能组成回文

A和B能组成回文 A= “ab” b=“ba”

A和C能组成回文 A=“ab” C=“cba”

此时B和C无法组成回文

A和B不能组成回文 A=“ab” B=“ab”

A和C不能组成回文 A=“ab” C=“cb”

此时B和C不能组成回文

A和B不能组成回文 A=“ab” B=“cb”

A和C不能组成回文 A=“ab” C=“bc”

此时B和C能组成回文

在这里插入图片描述

官方解答:

我们先遍历一遍整个字符串,然后把它所有可能的翻转都加入到Hash表中。

比如,我们有一个字符串"cat",我们就把"tac"和"ac"两个字符加入到Hash表中。

Hash表对应的值是一个链表,存储所有把字符加入到Hash表的值。

比如“cat”和“cab”都会把"ac"加入到Hash表中,所以应该用List来存。

然后,我们遍历这个数组,判断每个字符串是否存在于Hash表中,如果存在,那么就表示可以和某一个字符串组成回文。

实际上这种算法,如果字符串长度普遍长于字符串个数,那么时间复杂度反而会下降。

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页