1、统计一致字符串的数目
给你一个由不同字符组成的字符串 allowed 和一个字符串数组 words 。如果一个字符串的每一个字符都在 allowed 中,就称这个字符串是 一致字符串 。
请你返回 words 数组中 一致字符串 的数目。
示例 1:
输入:allowed = "ab", words = ["ad","bd","aaab","baa","badab"]
输出:2
解释:字符串 "aaab" 和 "baa" 都是一致字符串,因为它们只包含字符 'a' 和 'b' 。
示例 2:
输入:allowed = "abc", words = ["a","b","c","ab","ac","bc","abc"]
输出:7
解释:所有字符串都是一致的。
示例 3:
输入:allowed = "cad", words = ["cc","acd","b","ba","bac","bad","ac","d"]
输出:4
解释:字符串 "cc","acd","ac" 和 "d" 是一致字符串。
解答:
暴力解题:
class Solution:
def countConsistentStrings(self, allowed: str, words: List[str]) -> int:
count=0
for word in words:
dict={}
for i,val in enumerate(word):
dict[val]=i
key=list(dict.keys())
flag=0
for i in range(len(key)):
if(allowed.count(key[i])!=0):
flag+=1
if(flag==len(key)):
count+=1
return count
class Solution:
def countConsistentStrings(self, allowed: str, words: List[str]) -> int:
return sum( set(word).issubset(set(allowed)) for word in words)#issuset是否都包含
#set()集合函数
class Solution:
def countConsistentStrings(self, allowed: str, words: List[str]) -> int:
count=0
for i in words:
if set(allowed)>=set(i) :
count+=1
return count
2、验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:
输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
class Solution:
def isPalindrome(self, s: str) -> bool:
arr="".join(val.lower() for val in s if val.isalnum())
return arr[::1]==arr[::-1]
3、判定是否互为字符重排
给定两个字符串 s1 和 s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
示例 1:
输入: s1 = "abc", s2 = "bca"
输出: true
示例 2:
输入: s1 = "abc", s2 = "bad"
输出: false
解答:
class Solution:
def CheckPermutation(self, s1: str, s2: str) -> bool:
for val in set(s1):
if(s2.count(val)!=s1.count(val)):
return False
return set(s1)==set(s2)
参考答案:
排序:
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if (s1.length() != s2.length()) {
return false;
}
sort(s1.begin(), s1.end());
sort(s2.begin(), s2.end());
return s1 == s2;
}
};
哈希表:
class Solution {
public:
bool CheckPermutation(string s1, string s2) {
if (s1.length() != s2.length()) {
return false;
}
vector<int> table(26, 0);
for (auto& ch: s1) {
table[ch - 'a']++;
}
for (auto& ch: s2) {
table[ch - 'a']--;
if (table[ch - 'a'] < 0) {
return false;
}
}
return true;
}
};
4、按奇偶性交换后的最大数字
给你一个正整数 num 。你可以交换 num 中 奇偶性 相同的任意两位数字(即,都是奇数或者偶数)。
返回交换 任意 次之后 num 的 最大 可能值。
示例 1:
输入:num = 1234
输出:3412
解释:交换数字 3 和数字 1 ,结果得到 3214 。
交换数字 2 和数字 4 ,结果得到 3412 。
注意,可能存在其他交换序列,但是可以证明 3412 是最大可能值。
注意,不能交换数字 4 和数字 1 ,因为它们奇偶性不同。
示例 2:
输入:num = 65875
输出:87655
解释:交换数字 8 和数字 6 ,结果得到 85675 。
交换数字 5 和数字 7 ,结果得到 87655 。
注意,可能存在其他交换序列,但是可以证明 87655 是最大可能值。
参考答案:
class Solution:
def largestInteger(self, num: int) -> int:
l = [int(d) for d in list(str(num))] # 转化为各位数值的数组
n = len(l)
# 进行选择排序
for i in range(n - 1):
for j in range(i + 1, n):
# 只有下标数值奇偶相同才进行判断
if (l[i] - l[j]) % 2 == 0 and l[i] < l[j]:
l[i], l[j] = l[j], l[i]
# 转化为最终的整数
return int("".join(str(d) for d in l))
5、比特位计数
给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。
示例 1:
输入:n = 2
输出:[0,1,1]
解释:
0 --> 0
1 --> 1
2 --> 10
示例 2:
输入:n = 5
输出:[0,1,1,2,1,2]
解释:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101
参考答案:
动态规划
class Solution:
def countBits(self, n: int) -> List[int]:
bits = [0]
highBit = 0
for i in range(1, n + 1):
if i & (i - 1) == 0:
highBit = i
bits.append(bits[i - highBit] + 1)
return bits