1、判断是否互为字符重排
(1)需求说明
- 给定两个字符串
s1
和s2
,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。
(2)题解思路
- 字符串转数组比较:将字符串转换成字符数组,然后排序,再转换成字符串,比较两个字符串是否相等即可
- hashmap计数:统计字符串显得次数是否相同
(3)代码实战
- python代码
def CheckPermutation(s1,s2) -> bool:
if len(s1) != len(s2):
return False
else:
set_s1 = set(s1)
set_s2 = set(s2)
if(set_s1 - set_s2):
return False
else:
count1 = dict()
count2 = dict()
flag = 0
for char in s1:
count1[char] = s1.count(char, 0)
for char in s2:
count2[char] = s2.count(char, 0)
for key in count1:
if count1[key] != count2[key]:
flag = 1
break
if flag:
return False
else:
return True
- java代码
// 第一种思路:比较字符串都&单个字符出现的次数
public boolean Check1(String str1,String str2){
if (str1.length() != str2.length()){
return false;
}
Map<Character,Integer> s1Map = charNum(str1);
Map<Character,Integer> s2Map = charNum(str2);
char[] s1char = str1.toCharArray();
for(char s:s1char){
if(!s2Map.containsKey(s) || s2Map.get(s) != s1Map.get(s)){
return false;
}
}
return true;
}
// 统计指定字符串str出现的字符次数,并以map形式返回
public Map<Character,Integer> charNum(String str){
Map<Character,Integer> map = new HashMap<>();
char[] chars = str.toCharArray();
for (char aChar:chars){
map.put(aChar,map.getOrDefault(aChar,0)+1);
}
return map;
}
// 第二种思路:将字符串转换为字符集合并排序,比较两个集合是否相等
public boolean Check2(String str1,String str2){
char[] s1Char = str1.toCharArray();
char[] s2Char = str2.toCharArray();
Arrays.sort(s1Char);
Arrays.sort(s2Char);
return new String(s1Char).equals(new String(s2Char));
}
2、字符串替换
(1)题目描述
- 编写一种方法,将字符串中的空格全部替换为%20
(2)题解
- 将字符串转换成字符数组,循环遍历判断进行替换
(3)代码实战
- python
def str_tsf(s):
n = len(s)
ss = []
for i in range(0,n):
if s[i] == " ":
ss.append("%20")
else:
ss.append(s[i])
# 列表转换为字符串
str2 = "".join(ss)
return str2
- java代码
public String str_transf(String s1){
StringBuilder stringBuilder = new StringBuilder();
char[] s1Char = s1.toCharArray();
for(int i=0;i<s1.length();i++){
if(s1Char[i] == ' '){
stringBuilder.append("%20");
}else{
stringBuilder.append(s1Char[i]);
}
}
return stringBuilder.toString();
}
3、回文排列
(1)需求
- 给定一个字符串,编写一个函数判定其是否为某个回文串的排列之一。
(2)解决思路
- 回文串关于中心对称:其特点是除了长度为奇数的回文串中间的那个字符,其余字符若在前边出现一次,则必然在后边也出现一次。
1、创建一个空集合;
2、从头到尾扫描字符串。
若扫描到的字符不在集合中,将其放入集合;
若扫描到的字符在集合中,则可与其配成一对,为此从集合中移除该字符。
3、判断集合元素个数,若集合中元素个数小于2(也就是集合为空或集合中只有一个元素),则该字符串中的所有字符可以构成一个回文串,也就是该字符串是回文串的一个排列。反之,则不是。
(3)代码实战
- python
def str_check(str1)->bool:
myset = set()
for s in str1:
if s in myset:
myset.remove(s)
else:
myset.add(s)
return len(myset)<2
- java
public boolean str_check(String str){
Set<Character> set = new HashSet<>();
for(char s:str.toCharArray()){
// set的add方法如果返回false,表示已经有了,则删除
if(!set.add(s)){
set.remove(s);
}
}
// 判断set的长度是否小于等于1,如果等于1说明奇数,如果等于0则说明是偶数
return set.size() <=1;
}