跳到主要内容

859.亲密字符串

链接:859.亲密字符串
难度:Easy
标签:哈希表、字符串
简介:给定两个由小写字母构成的字符串 A 和 B ,只要我们可以通过交换 A 中的两个字母得到与 B 相等的结果,就返回 true ;否则返回 false 。

题解 1 - typescript

  • 编辑时间:2021-03-14
  • 执行用时:92ms
  • 内存消耗:40.5MB
  • 编程语言:typescript
  • 解法介绍:取三段进行比较。
function buddyStrings(a: string, b: string): boolean {
const len = a.length;
if (len !== b.length) return false;
if (a === b) return new Set([...a]).size !== len;
let i = 0;
while (i < len && a[i] === b[i]) i++;
let j = i + 1;
while (j < len && a[j] === b[j]) j++;
if (j === len) return false;
if (a[i] !== b[j] || a[j] !== b[i]) return false;
return (
a.substring(0, i) === b.substring(0, i) &&
a.substring(i + 1, j) === b.substring(i + 1, j) &&
a.substring(j + 1) === b.substring(j + 1)
);
}

题解 2 - typescript

  • 编辑时间:2021-03-14
  • 执行用时:100ms
  • 内存消耗:40.6MB
  • 编程语言:typescript
  • 解法介绍:优化题解 1,直接判断最后一段。
function buddyStrings(a: string, b: string): boolean {
const len = a.length;
if (len !== b.length) return false;
if (a === b) return new Set([...a]).size !== len;
let i = 0;
while (i < len && a[i] === b[i]) i++;
let j = i + 1;
while (j < len && a[j] === b[j]) j++;
if (j === len) return false;
if (a[i] !== b[j] || a[j] !== b[i]) return false;
while (++j < len) if (a[j] !== b[j]) return false;
return true;
}

题解 3 - typescript

  • 编辑时间:2021-11-23
  • 执行用时:80ms
  • 内存消耗:40.9MB
  • 编程语言:typescript
  • 解法介绍:校验字符错位个数。
function buddyStrings(s: string, goal: string): boolean {
const getmap = (str: string) =>
str.split('').reduce<Record<string, number>>((map, ch) => {
map[ch] = (map[ch] ?? 0) + 1;
return map;
}, {});
const map1 = getmap(s);
const map2 = getmap(goal);
if (Object.entries(map1).some(([k, v]) => map2[k] !== v)) return false;
let cnt = 0;
const len = s.length;
for (let i = 0; i < len; i++) {
if (s[i] !== goal[i]) cnt++;
}
if (cnt === 0) return Object.values(map1).some(v => v >= 2);
if (cnt !== 2) return false;
return true;
}

题解 4 - c

  • 编辑时间:2021-11-23
  • 内存消耗:5.6MB
  • 编程语言:c
  • 解法介绍:校验字符错位个数。
bool buddyStrings(char * s, char * goal){
if (strlen(s) != strlen(goal)) return false;
int map1[26] = {0}, map2[26] = {0}, len = strlen(s), has_repeat = 0;
for (int i = 0; i < len; i++) {
map1[s[i] - 'a']++;
map2[goal[i] - 'a']++;
}
for (int i = 0; i < 26; i++) {
if (map1[i] != map2[i]) return false;
if (map1[i] >= 2) has_repeat = 1;
}
int cnt = 0;
for (int i = 0; i < len; i++) {
if (s[i] != goal[i]) {
if (++cnt > 2) return false;
}
}
if (cnt == 0) return has_repeat == 1;
return true;
}