边工作边刷题:70天一遍leetcode: day 80
Palindrome Permutation I/II
要点:
- oddCount to increase/decrease count
- II:
- chars: 先统计,再得到一半的c,相同的在一起,所以是不用排序的(permute去重需要排序)
- odds: odds只能在中间,所以要存起来,最后直接拼接,不参与permutation。这样就免去了用变量计数来做奇偶判定。
https://repl.it/ChGE/1 (I: java)
错误点:
- java: string foreach loop: for(char c : s.toCharArray()) else : error: for-each not applicable to expression type
- java: == higher priority than & : (umap.get(c)&1)==1
https://repl.it/ChGE/2 (I: python)
https://repl.it/Chza/2 (II: python)
错误点:
- permutation 1:注意和combination不同,recursion里的index是position(一律用start省的出错),而循环是对每个字符,进入下一层passed in是start+1
- 如果+和if else,注意括号
import java.util.*;
class Main {
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.canPermutePalindrome("code"));
System.out.println(sol.canPermutePalindrome("aab"));
System.out.println(sol.canPermutePalindrome("carerac"));
}
}
/*
Given a string, determine if a permutation of the string could form a palindrome.
For example,
"code" -> False, "aab" -> True, "carerac" -> True.
Hint:
Consider the palindromes of odd vs even length. What difference do you notice?
Count the frequency of each character.
If each character occurs even number of times, then it must be a palindrome. How about character which occurs odd number of times?
Tags: Hash Table
Similar Problems: (M) Longest Palindromic Substring, (E) Valid Anagram, (M) Palindrome Permutation II
*/
class Solution {
public boolean canPermutePalindrome(String s) {
Map<Character, Integer> umap = new HashMap<>();
int oddCount = 0;
for(char c : s.toCharArray()) { // error 1: error: for-each not applicable to expression type for(char c: s)
if(!umap.containsKey(c)) {
umap.put(c, 0);
}
umap.put(c, umap.get(c)+1);
if((umap.get(c)&1)==1){ // error 2: error: bad operand types for binary operator '&' int and boolean: == has higher priority than &
oddCount++;
} else {
oddCount--;
}
}
return oddCount<=1;
}
}
import java.util.*;
class Main {
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.canPermutePalindrome("code"));
System.out.println(sol.canPermutePalindrome("aab"));
System.out.println(sol.canPermutePalindrome("carerac"));
}
}
/*
Given a string, determine if a permutation of the string could form a palindrome.
For example,
"code" -> False, "aab" -> True, "carerac" -> True.
Hint:
Consider the palindromes of odd vs even length. What difference do you notice?
Count the frequency of each character.
If each character occurs even number of times, then it must be a palindrome. How about character which occurs odd number of times?
Tags: Hash Table
Similar Problems: (M) Longest Palindromic Substring, (E) Valid Anagram, (M) Palindrome Permutation II
*/
class Solution {
public boolean canPermutePalindrome(String s) {
Map<Character, Integer> umap = new HashMap<>();
int oddChars = 0;
for(char c : s.toCharArray()) { // error 1: error: for-each not applicable to expression type for(char c: s)
if(!umap.containsKey(c)) {
umap.put(c, 0);
}
umap.put(c, umap.get(c)+1);
if((umap.get(c)&1)==1){ // error 2: error: bad operand types for binary operator '&' int and boolean: == has higher priority than &
oddChars++;
} else {
oddChars--;
}
}
return oddChars<=1;
}
}
# Problem Description:
# Given a string s, return all the palindromic permutations (without duplicates) of it. Return an empty list if no palindromic permutation could be form.
# For example:
# Given s = "aabb", return ["abba", "baab"].
# Given s = "abc", return [].
# Hint:
# If a palindromic permutation exists, we just need to generate the first half of the string.
# To generate all distinct permutations of a (half of) string, use a similar approach from: Permutations II or Next Permutation.
from collections import Counter
class Solution(object):
def generatePalindromes(self, s):
"""
:type s: str
:rtype: List[str]
"""
def permute(s, start, used, res, solutions):
if start>=len(s):
solutions.append(res)
return
for i in xrange(len(s)): # error, not from start
if i>start and s[i]==s[i-1] and not used[i-1]: continue
if not used[i]:
used[i]=True
permute(s, start+1, used, res+s[i], solutions)
used[i]=False
counts, chars = Counter(s), []
odds, evens = [], []
for c in counts:
if counts[c]%2:
odds.append(c)
if counts[c]>1: # error: odds can also append
chars.append(c*(counts[c]/2))
else:
evens.append(c)
chars.append(c*(counts[c]/2))
if len(odds)>1:
return []
# print chars
used, solutions = [False]*len(chars), []
permute(chars, 0, used, "", solutions)
# print solutions
return [s+(odds[0] if odds else "")+s[::-1] for s in solutions] # error: priority
sol = Solution()
assert sol.generatePalindromes("aabb")==['abba', 'baab']
assert sol.generatePalindromes("abc")==[]
assert sol.generatePalindromes("aaabb")==['ababa', 'baaab']
边工作边刷题:70天一遍leetcode: day 80的更多相关文章
- 边工作边刷题:70天一遍leetcode: day 89
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner ...
- 边工作边刷题:70天一遍leetcode: day 77
Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chw ...
- 边工作边刷题:70天一遍leetcode: day 78
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 g ...
- 边工作边刷题:70天一遍leetcode: day 85-3
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext ...
- 边工作边刷题:70天一遍leetcode: day 101
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d ...
- 边工作边刷题:70天一遍leetcode: day 1
(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 边工作边刷题:70天一遍leetcode: day 71-3
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: ...
- 边工作边刷题:70天一遍leetcode: day 71-2
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录misma ...
随机推荐
- coffeescript 1.8.0 documents
CoffeeScript is a little language that compiles into JavaScript. Underneath that awkward Java-esque ...
- 成熟的RosettaNet解决方案软件介绍
RosettaNet是一套B2B标准,以标准来优化供应链管理流程,它可以缩短整个供应链各个供货周期.RosettaNet 标准为电子商务标准化提供一个健壮的.非专有的解决方案,它是免费的,通过 Ros ...
- Angularjs,WebAPI 搭建一个简易权限管理系统 —— Angularjs 前端主体结构(五)
目录 前言 Angularjs名词与概念 Angularjs 基本功能演示 系统业务与实现 WebAPI项目主体结构 Angularjs 前端主体结构 6 Angularjs 前端主体结构 6.1 A ...
- H5调用Android播放视频
webView.loadUrl("http://10.0.2.2:8080/assets/RealNetJSCallJavaActivity.htm"); js调用的Java文件中 ...
- [Intellij] 编译报错 javacTask
报错信息: Idea 编译报错 javacTask: 源发行版 1.6 需要目标发行版 1.6 解决方案:
- 【GOF23设计模式】中介者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_中介者模式.同事协作类.内部类实现 package com.test.mediator; /** * 同事类的接口 */ ...
- javascript作用域链学习笔记
作用域链 "JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里." --权威指南 在JavaScript中,一切皆对象,包括函数.函数对象和其它对象 ...
- 设计模式:模版模式(Template Pattern)-转
模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程 ...
- C++中const用法总结
1修饰变量/指针 注意以下几种修饰的区别: (1)const int * a; (2)int const *a; (3)int * const b; (4)int const* const c; 其中 ...
- Effective Java 69 Prefer concurrency utilities to wait and notify
Principle Use the higher-level concurrency utilities instead of wait and notify for easiness. Use Co ...