其他分享
首页 > 其他分享> > 面试题 01.04. 回文排列

面试题 01.04. 回文排列

作者:互联网

文章目录


题目

给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
回文串是指正反两个方向都一样的单词或短语。排列是指字母的重新排列。
回文串不一定是字典当中的单词。

示例1:

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


解题思路

1.使用hashMap统计出现频率

思路

代码

public class Test {
    public static void main(String[] args) {
        String string = "aaabbdd";
        System.out.println(solution(string));
    }

    public static boolean solution(String s) {
        if (s.length() == 0){
            return true;
        }
        HashMap<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < s.length(); i++) {
            if (!map.containsKey(s.charAt(i))) {
                map.put(s.charAt(i), 0);
            }
            map.put(s.charAt(i), map.get(s.charAt(i)) + 1);
        }
        //最多只能有一个为奇数,大于1则返回false
        int flag = 0;
        for (Map.Entry<Character, Integer> entry : map.entrySet()) {
            if (entry.getValue() % 2 == 1) {
                flag++;
            }
            if (flag>1){
                return false;
            }
        }
        return true;
    }
}

性能


1.5也可以使用set判断!

思路

    public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

因为map的put方法如果没有进行覆盖,那么返回的是null
如果出现重复的key,会将之前的old值进行返回
set底层就是用map的Key来保证的元素唯一性
假如先插入一个a进入set,那么其实就保存到map中了**(key是‘a’,值为obj)**
如果再来个a进入set,那么也就相当于put进map,发生key重复,进行覆盖,并将old value也就是obj进行返回
这个时候add方法返回 map.put(e, PRESENT)==null; 即为false。

看看代码

    public boolean solution(String s) {
        Set<Character> set = new HashSet<>();
        for (char ch : s.toCharArray()) {
            if (!set.add(ch)) {
                set.remove(ch);
            }
        }
        return set.size() <= 1;
    }

2.使用栈进行消消乐~

思路

代码

public class Test {
    public static void main(String[] args) {
        String string = "aaabbdd";
        System.out.println(solution(string));
    }

    public static boolean solution(String s) {
        if (s.length() == 0) {
            return true;
        }
        char[] chars = s.toCharArray();
        Arrays.sort(chars);
        Stack<Character> stack = new Stack<>();
        for (char c : chars) {
        //这里要先判断一下是否为空,不然栈为空的时候stack.peek()会报空指针
            if (stack.size() == 0 || stack.peek() != c) {
                if (stack.size() > 1) {
                    return false;
                }
                stack.push(c);
            } else {
                stack.pop();
            }
        }
        if (stack.size() > 1) {
            return false;
        }
        return true;
    }
}

性能
在这里插入图片描述

标签:map,面试题,set,return,String,public,01.04,stack,回文
来源: https://blog.csdn.net/weixin_37749732/article/details/120346502