leetcode之面试金典(持续更新中...)

1、判断是否互为字符重排

(1)需求说明

  • 给定两个字符串 s1s2,请编写一个程序,确定其中一个字符串的字符重新排列后,能否变成另一个字符串。

在这里插入图片描述

(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;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随缘清风殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值