Leetcode每日一题 —— 2840. 判断通过操作能否让字符串相等 II

2026-04-11 14:521阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐
问题描述:
力扣 LeetCode

2840. 判断通过操作能否让字符串相等 II - 力扣(LeetCode)

2840. 判断通过操作能否让字符串相等 II - 给你两个字符串s1和s2,两个字符串长度都为n,且只包含小写英文字母。 你可以对两个字符串中的 任意一个执行以下操作 任意次: * 选择两个下标i 和j,满足 i < j且 j - i是 偶数,然后 交换 这个字符串中两个下标对应的字符。 如果你可以让字符串s1 和s2相等,那么返回 true,否则返回 false。 示例 1: 输入:s1 = "abcdba", s2 =...

思路
依旧跟昨天类似的思路,分别统计奇/偶数位的字母数量是否相同。

代码

class Solution { public boolean checkStrings(String s1, String s2) { // 偶/奇数位的字母数量 int[] cnt0 = new int[26]; int[] cnt1 = new int[26]; // 第一个字符串正向统计数量 for (int i = 0; i < s1.length(); i+=2) { cnt0[s1.charAt(i) - 'a']++; } for (int i = 1; i < s1.length(); i+=2) { cnt1[s1.charAt(i) - 'a']++; } // 第二个字符串负向统计数量 for (int i = 0; i < s2.length(); i+=2) { cnt0[s2.charAt(i) - 'a']--; } for (int i = 1; i < s2.length(); i+=2) { cnt1[s2.charAt(i) - 'a']--; } // 如果最终数量为0说明两个字符串可以相等 for (int i : cnt0) { if (i != 0) { return false; } } for (int i : cnt1) { if (i != 0) { return false; } } return true; } } 网友解答:


--【壹】--:

i只能和i+2, i+4, i+6, … 交换
奇数idx和奇数idx交换,偶数idx和偶数idx交换
同为奇数/偶数下标组成的数组能有任意顺序
切片后检查统计结果是否相等即可

class Solution: def checkStrings(self, s1: str, s2: str) -> bool: return Counter(s1[0::2]) == Counter(s2[0::2]) and \ Counter(s1[1::2]) == Counter(s2[1::2])


--【贰】--:

如昨天所料,确实加长了字符串长度,这个时候可以发现:奇数位置的字符换不到偶数位置上,反之亦然

因此这题可以转换为检查 s1 中奇数位置上和偶数位置上的各字符出现频数能否被 s2 中相应抵消掉。

class Solution { public: bool checkStrings(string s1, string s2) { // 奇数位置的字符换不到偶数位置上,反之亦然 // 显然就是看奇数和偶数位置上各字符出现的频数 int oddMap[26],evenMap[26]; memset(oddMap,0,sizeof(oddMap)); memset(evenMap,0,sizeof(evenMap)); int n=s1.size(); for(int i=0;i<n;i++){ // s1 和 s2 在奇数和偶数位置上应当能互相抵消 if((i&1)==0){ evenMap[s1[i]-'a']++; evenMap[s2[i]-'a']--; }else{ oddMap[s1[i]-'a']++; oddMap[s2[i]-'a']--; } } for(int i=0;i<26;i++){ if(evenMap[i]!=0||oddMap[i]!=0){ // 只要没有抵消就不行 return false; } } return true; } };


--【叁】--:

打卡

impl Solution { pub fn check_strings(s1: String, s2: String) -> bool { let mut diff = vec![vec![0; 26]; 2]; let (b1, b2) = (s1.as_bytes(), s2.as_bytes()); for i in 0..b1.len() { diff[i & 1][(b1[i] - b'a') as usize] += 1; diff[i & 1][(b2[i] - b'a') as usize] -= 1; } !diff[0].iter().any(|x| *x != 0) && !diff[1].iter().any(|x| *x! = 0) } }


--【肆】--:

class Solution: def canBeEqual(self, s1: str, s2: str) -> bool: return Counter(s1[::2]) == Counter(s2[::2]) and Counter(s1[1::2]) == Counter(s2[1::2])


--【伍】--:

每日一题咯


--【陆】--:

它们的Counter好好使的样子(

class Solution { private: template<typename... Container> void Sort_All(Container&... container) { (std::sort(container.begin(),container.end()), ...); } public: bool checkStrings(string s1, string s2) { auto get_sub = [](string &s,int idx) -> string { string subs = ""; for(int i = idx;i < s.size(); i+= 2) { subs += s[i]; } return subs; }; std::string s1_even = get_sub(s1,0),s1_odd = get_sub(s1,1); std::string s2_even = get_sub(s2,0),s2_odd = get_sub(s2,1); Sort_All(s1_even,s1_odd,s2_even,s2_odd); return (s1_even == s2_even && s1_odd == s2_odd); } };


--【柒】--:

来这么早佬友