边工作边刷题: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 ...
随机推荐
- Orchard MySql 修正版 下载
Orchard是支持多种数据库的如果是个人站长推荐使用MySql作为运行数据库,虽然SqlServer更为强大,但总觉得SqlServer好重啊,一装就是几个G. 最近的版本在使用MySql建库时却会 ...
- ServiceStack.Text反序列化lowercase_underscore_names格式的JSON
代码: [Test] public void Test() { JsConfig.PropertyConvention = JsonPropertyConvention.Lenient; var js ...
- 通过NameValuePairsValueProvider对象来获取指定前缀的Key
using System; using System.Collections.Generic; using System.Linq; using System.Web.Http.ValueProvid ...
- SharpGL学习笔记(十六) 多重纹理映射
多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...
- springmvc+mybatis+spring 整合
获取[下载地址] [免费支持更新]三大数据库 mysql oracle sqlsever 更专业.更强悍.适合不同用户群体[新录针对本系统的视频教程,手把手教开发一个模块,快速掌握本系统] ...
- 自定义XML动态配置程序
概述 1 在做程序开发时,我们往往要用到如下两个基本模块 1> 设置程序的基础参数,如分页的参数.邮件参数等: 2> 在基于表驱动开发时,即把一些判断的逻辑放在表数据中: 2 在这两个基本 ...
- AJAX编程-封装ajax工具函数
即 Asynchronous [e'sɪŋkrənəs] Javascript And XML,AJAX 不是一门的新的语言,而是对现有技术的综合利用.本质是在HTTP协议的基础上以异步的方式与服务器 ...
- GetStartedWithWin10Develop
GetStartedWithWin10Develop 首先要确保已经配置好win10开发环境,开始第一个win10开发的HelloWorld 1.首先创建你的win10项目(示例的项目名称为 Hell ...
- SharePoint 2013中Office Web Apps的一次排错
转自http://www.cnblogs.com/awpatp/archive/2013/06/06/3121420.html, 仅供自己查看 笔者尝试在自己的测试环境中为SharePoint 201 ...
- 高精度练习(hdoj1042)
Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in ...