算法千题案例每日一练LeetCode打卡——103.亲密字符串

Posted 呆呆敲代码的小Y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法千题案例每日一练LeetCode打卡——103.亲密字符串相关的知识,希望对你有一定的参考价值。


📢前言

🚀 算法题 🚀
  • 🌲 每天打卡一道算法题,既是一个学习过程,又是一个分享的过程😜
  • 🌲 提示:本专栏解题 编程语言一律使用 C# 和 Java 两种进行解题
  • 🌲 要保持一个每天都在学习的状态,让我们一起努力成为算法大神吧🧐!
  • 🌲 今天是力扣算法题持续打卡第103天🎈!
🚀 算法题 🚀

🌲原题样例:亲密字符串

给你两个字符串 sgoal ,只要我们可以通过交换 s 中的两个字母得到与 goal 相等的结果,就返回 true ;否则返回 false

交换字母的定义是:取两个下标 ij (下标从 0 开始)且满足 i != j ,接着交换s[i]s[j]处的字符。

例如,在 "abcd" 中交换下标 0 和下标 2 的元素可以生成 "cbad"

示例1:

输入:s = "ab", goal = "ba"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 相等。

示例2:

输入:s = "ab", goal = "ab"
输出:false
解释:你只能交换 s[0] = 'a' 和 s[1] = 'b' 生成 "ba",此时 s 和 goal 不相等。

示例3:

输入:s = "aa", goal = "aa"
输出:true
解释:你可以交换 s[0] = 'a' 和 s[1] = 'a' 生成 "aa",此时 s 和 goal 相等。

示例4:

输入:s = "aaaaaaabc", goal = "aaaaaaacb"
输出:true

提示:

  • 1 <= s.length, goal.length <= 2 * 104
  • s 和 goal 由小写英文字母组成

🌻C#方法:枚举

设两个字符串分别为 s 和 goal,其中 s[i] 表示 s 的第 i 个字符,其中 goal[i] 表示 goal 的第 i 个字符。

如果 s[i]=goal[i],我们就说 i 是匹配的,否则称 i 是不匹配的。

亲密字符串定义为:需要交换 s 中的第 i 个字符 s[i] 与 s 中第 j 个字符且满足i =j,交换后 s 与 goal 相等。

亲密字符串的两个字符串需要交换一次索引不相等的两个字符后相等。

代码:

public class Solution 
    public bool BuddyStrings(string s, string goal) 
        if (s.Length != goal.Length) 
            return false;
        
        
        if (s.Equals(goal)) 
            int[] count = new int[26];
            for (int i = 0; i < s.Length; i++) 
                count[s[i] - 'a']++;
                if (count[s[i] - 'a'] > 1) 
                    return true;
                
            
            return false;
         else 
            int first = -1, second = -1;
            for (int i = 0; i < goal.Length; i++) 
                if (s[i] != goal[i]) 
                    if (first == -1)
                        first = i;
                    else if (second == -1)
                        second = i;
                    else
                        return false;
                
            

            return (second != -1 && s[first] == goal[second] && s[second] == goal[first]);
        
    

执行结果

通过
执行用时:84 ms,在所有 C# 提交中击败了47.14%的用户
内存消耗:37.9 MB,在所有 C# 提交中击败了23.70%的用户

🌻Java 方法:枚举

思路解析

设两个字符串分别为 s 和 goal,其中 s[i] 表示 s 的第 i 个字符,其中 goal[i] 表示 goal 的第 i 个字符。

如果 s[i]=goal[i],我们就说 i 是匹配的,否则称 i 是不匹配的。

亲密字符串定义为:需要交换 s 中的第 i 个字符 s[i] 与 s 中第 j 个字符且满足i =j,交换后 s 与 goal 相等。

亲密字符串的两个字符串需要交换一次索引不相等的两个字符后相等。

代码:

class Solution 
    public boolean buddyStrings(String s, String goal) 
        if (s.length() != goal.length()) 
            return false;
        
        
        if (s.equals(goal)) 
            int[] count = new int[26];
            for (int i = 0; i < s.length(); i++) 
                count[s.charAt(i) - 'a']++;
                if (count[s.charAt(i) - 'a'] > 1) 
                    return true;
                
            
            return false;
         else 
            int first = -1, second = -1;
            for (int i = 0; i < goal.length(); i++) 
                if (s.charAt(i) != goal.charAt(i)) 
                    if (first == -1)
                        first = i;
                    else if (second == -1)
                        second = i;
                    else
                        return false;
                
            

            return (second != -1 && s.charAt(first) == goal.charAt(second) &&
                    s.charAt(second) == goal.charAt(first));
        
    

执行结果

通过
执行用时:2 ms,在所有 Java  提交中击败了67.41%的用户
内存消耗:38.4 MB,在所有 Java 提交中击败了15.53%的用户

复杂度分析

时间复杂度:O(N),其中 N 为字符串的长度
空间复杂度:O(C),需要常数个空间保存字符串的字符统计次数,我们统计所有小写字母的个数,因此 C = 26

💬总结

  • 今天是力扣算法题打卡的第103天!
  • 文章采用 C#Java 两种编程语言进行解题
  • 一些方法也是参考力扣大神写的,也是边学习边分享,再次感谢算法大佬们
  • 那今天的算法题分享到此结束啦,明天再见!

以上是关于算法千题案例每日一练LeetCode打卡——103.亲密字符串的主要内容,如果未能解决你的问题,请参考以下文章

算法千题案例每日一练LeetCode打卡——107.重塑矩阵

算法千题案例每日一练LeetCode打卡——110.种花问题

算法千题案例每日一练LeetCode打卡——109.分糖果

算法千题案例每日一练LeetCode打卡——110.种花问题

算法千题案例每日一练LeetCode打卡——109.分糖果

算法千题案例每日一练LeetCode打卡——105.仅仅反转字母