Leetcode每日一题 —— 2840. 判断通过操作能否让字符串相等 II
- 内容介绍
- 文章标签
- 相关推荐
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);
}
};
--【柒】--:
来这么早佬友
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);
}
};
--【柒】--:
来这么早佬友

