[LeetCode]面试题 01.04. 回文排列

题目描述

难度 简单

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。

回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。

回文串不一定是字典当中的单词。

示例1:

输入:"tactcoa"
输出:true(排列有"tacocat"、"atcocta",等等)

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


思路

题意说的是:给定一个字符串,判断这个字符串重新排列后能否成为回文串。

 * 提示1:你不必且也不应该生成所有的排列。这将极为低效。
 * 提示2:作为回文排列的字符串有什么特征?
 答:通过规律发现特征,通过特征实现算法。特点1).回文串是左右对称的,即两两一对;特点2).最多允许一个字符不在对称序列内,即中间那个字符。由两特征可以推出,两两相消,最终只剩0或者1个字符时,则表明此字符串可通过重排列后组成回文串。
 * 提示3:你试过散列表吗?你应该能把它降到O(N)的时间。
 答:Set集合、队列都可以实现,主要是性能上的不同
 * 提示4:使用位向量可以减少空间使用吗?

这道题与[LeetCode]20. 有效的括号思路有部分相似之处。

代码实现

算法实现1

class Solution {
    public boolean canPermutePalindrome(String s) {
        if(s == null) return false;

        Set<Character> datastructure = new HashSet<Character>();
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (datastructure.contains(c)) {
                datastructure.remove(c);
            } else {
                datastructure.add(c);
            }
        }
        return datastructure.size() <= 1;
    }
}

执行结果:通过
执行用时:0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:36.4 MB, 在所有 Java 提交中击败了5.10% 的用户
通过测试用例:27 / 27

算法实现2

class Solution {
    public boolean canPermutePalindrome(String s) {
        if(s == null) return false;

        //Set<Character> datastructure = new HashSet<Character>();
        Queue<Character> datastructure = new LinkedBlockingQueue<>();
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (datastructure.contains(c)) {
                datastructure.remove(c);
            } else {
                datastructure.add(c);
            }
        }
        return datastructure.size() <= 1;
    }
}

执行结果:通过
执行用时:4 ms, 在所有 Java 提交中击败了43.97% 的用户
内存消耗:36.5 MB, 在所有 Java 提交中击败了5.10% 的用户
通过测试用例:27 / 27

记录与总结,2021年 12月 04日 星期六 02:17:55 CST。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dnbug Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值