无法在javascript中删除两个字符串中的常见字母



我需要从两个字符串中删除公共字母。但是,有些字母被删除了,有些没有。在本例中,a在两个字符串中都是常见的。但不会被删除。你能告诉我我做错了什么吗?

var a = "car"
var b = "karthic"
var c = a.length;
var d = b.length;
for (var i = 0; i < c; i++) {
for (var j = 0; j < d; j++) {
if (a[i] === b[j]) {
a = a.slice(0, i) + a.slice(i + 1);
b = b.slice(0, j) + b.slice(j + 1);
break;
}
}
}
console.log(a + " " + b);

首先找到所有常见的字母,然后从每个字符串中删除它们:

var a = "car"
var b = "karthic"
var c = a.length;
var d = b.length;
var commonLetters = [];
for (var i = 0; i < c; i++) {
for (var j = 0; j < d; j++) {
if (a[i] === b[j]) {
commonLetters.push(a[i]);
}
}
}
var regex = new RegExp('[' + commonLetters.join('') + ']', 'g')
a = a.replace(regex, '');
b = b.replace(regex, '');
console.log('A: ' + a, 'B: ' + b, commonLetters);

您可以将两个字符串转换为一个集合,找到差异,然后过滤(包括(差异中包含的任何字符。

访问Set是O(1(,这比您(最坏情况(的O(n^2(循环要好。你必须过滤每个字符串中的所有字符,所以这将是O(n(复杂性作为你的基本情况。

// Reusable
const strSet = (str) => new Set(str.split(''));
const setDiff = (a, b) => new Set(Array.from(a).filter(item => !b.has(item)));
const prune = (str, set) => str.split('').filter(x => set.has(x)).join('');
// Specific
const a = 'car', b = 'karthic';
const diff = setDiff(strSet(b), strSet(a));
const a1 = prune(a, diff), b1 = prune(b, diff);
console.log(`a1 = "${a1}"nb1 = "${b1}"`);

let a = "car"
let b = "karthic";
let resultA = a.split('').filter((elem) => b.indexOf(elem) == -1).join('');
let resultB = b.split('').filter((elem) => a.indexOf(elem) == -1).join('');
console.log(resultB);
console.log(resultA);

您的循环没有考虑字符串的缩减。

这是你的字符串在第三个外层for循环的开头:

var a="a" //length 1, 'a' is at index 0
var b="kathi" //length 5, 'a' is in index 1

当算法到达第三个循环时,for循环变量的"i"将指向索引"2"。此时,变量"a"中的"c"one_answers"r"已被删除,字符串中只剩下字符"a"。此变量将位于索引0处。因此,当"i"循环查看索引"2"时,它将找不到任何内容。

console.log(a[2]) //undefined
console.log(b[5]) //undefined

您需要修改您的算法,以将新的大小长度考虑在内。

最新更新