zoukankan      html  css  js  c++  java
  • [LeetCode 266] Palindrome Permutation

    Palindrome Permutation

    • palindrome中,字符均是成对出现的(除了当字符串长度是单数时的中间字母)
    • 创建一个set对象
    • 遍历字符串,当遇到一个字符的时候检测set中有没有该字符。
      • 如果有则将该字符从set中删除
      • 否则,将该字符添加到set
    • 最后检测set中元素的个数
      • 个数小于等于1时,说明满足条件。

    Implementation

    public class Solution {
        public boolean canPermutePalindrome(String s) {
            HashSet<Character> set = new HashSet<Character>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (!set.add(c)) { // if the set contains c, add() will return false
                    set.remove(c);
                }
            }
            return set.size() <= 1;
        }
    }
    

    Palindrome Permutation II

    • 使用Palindrome Permutation的方法判断给定的字符串是否可以构造palindrome字符串
    • 选择构造palindrome一半所需要的字符和mid字符
    • 产生permutation

    Implementation

    public class Solution {
        public List<String> generatePalindromes(String s) {
            ArrayList<Character> charList = new ArrayList<Character>();
            HashSet<Character> set = new HashSet<Character>();
            for (int i = 0; i < s.length(); i++) {
                char c = s.charAt(i);
                if (!set.add(c)) {
                    set.remove(c);
                    charList.add(c);
                }
            }
            Collections.sort(charList);
            List<String> result = new ArrayList<String>();
            if (set.size() > 1) {
                return result;
            }
            // 使用iterator遍历set
            Iterator<Character> iter = set.iterator();
            String mid = "";
            if (iter.hasNext()) {
                mid += iter.next();
            }
            generatePermutations(result, charList, new StringBuilder(), mid);
            return result;
        }
    
        private void generatePermutations(List<String> result, ArrayList<Character> charList, StringBuilder sb, String mid) {
            if (charList.size() == 0) {
                result.add(sb.toString() + mid + sb.reverse().toString());
                sb.reverse();
                return;
            }
    
            for (int i = 0; i < charList.size(); i++) {
                if (i == 0 || charList.get(i) != charList.get(i - 1)) {
                    char c = charList.get(i);
                    sb.append(c);
                    charList.remove(i);
                    generatePermutations(result, charList, sb, mid);
                    sb.deleteCharAt(sb.length() - 1);
                    charList.add(i, c);
                }
            }
        }
    }
    

    Valid Palindrome

    Implementation

    public class Solution {
        public boolean isPalindrome(String s) {
            int left = 0;
            int right = s.length() - 1;
            while (left < right) {
                if (Character.isLetterOrDigit(s.charAt(left)) && Character.isLetterOrDigit(s.charAt(right))) {
                    if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right)))
                        return false;
                    left++;
                    right--;
                }
                else {
                    if (!Character.isLetterOrDigit(s.charAt(left)))
                        left++;
                    if (!Character.isLetterOrDigit(s.charAt(right)))
                        right--;
                }
    
            }
            return true;
        }
    }
    

    Palindrome Partitioning

    • time complexity: n!

    Implementation

    public class Solution {
        public List<List<String>> partition(String s) {
            List<List<String>> result = new ArrayList<List<String>>();
            List<String> list = new ArrayList<String>();
            partition(s, 0, list, result);
            return result;
        }
    
        private void partition(String s, int start, List<String> list, List<List<String>> result) {
            if (start == s.length()) {
                result.add(new ArrayList<String>(list));
                return;
            }
    
            for (int i = start; i < s.length(); i++) {
                if (isPalindrome(s, start, i)) {
                    // pay attention to parameter of substring()
                    list.add(s.substring(start, i + 1));
                    partition(s, i + 1, list, result);
                    list.remove(list.size() - 1);
                }
            }
        }
    
        private boolean isPalindrome(String s, int left, int right) {
            while (left <= right) {
                if (s.charAt(left) != s.charAt(right)) {
                    return false;
                }
                // don't forget move pointers
                left++;
                right--;
            }
            return true;
        }
    }
    
  • 相关阅读:
    BootStrap .row-cols 类的用法
    苹果手机浏览器$(document).on(“click”,function(){})点击无效的问题
    $("节点名").html("字符串")和$("节点名").text("字符串")区别
    linux 安装Nginx
    linux安装nginx
    vue dev开发环境跨域和build生产环境跨域问题解决
    正在载入中......loading页面的几种方法
    浏览器断点调试js
    vue组件之间传值方式解析
    基于Vue + Vuex + Vue-router + Webpack 2.0打造微信界面
  • 原文地址:https://www.cnblogs.com/Victor-Han/p/5190212.html
Copyright © 2011-2022 走看看