📅  最后修改于: 2023-12-03 15:25:02.827000             🧑  作者: Mango
在处理字符串时,有时我们需要找到第一个非重复的字符在字符串中的位置。这个过程可以用多种方法实现。下面我们将介绍一些解决方案,并提供相应的代码示例。
该方法是最简单、最直接的方法,它的思路是:对于字符串中的每一个字符,统计它在字符串中出现的次数,如果只出现了一次,那么就是我们要找的第一个非重复字符。
function firstNonRepeatingChar1(str) {
for (let i = 0; i < str.length; i++) {
let char = str.charAt(i);
if (str.indexOf(char) === i && str.indexOf(char, i + 1) === -1) {
return i;
}
}
return -1;
}
该方法的时间复杂度是O(n^2),不适合处理大规模的字符串。
我们可以利用哈希表存储字符出现的次数,然后对每一个字符在哈希表中查找它的出现次数。找到第一个出现次数为1的字符,就是要找的第一个非重复字符。
function firstNonRepeatingChar2(str) {
let charCount = {};
for (let i = 0; i < str.length; i++) {
let char = str.charAt(i);
if (charCount[char]) {
charCount[char]++;
} else {
charCount[char] = 1;
}
}
for (let i = 0; i < str.length; i++) {
let char = str.charAt(i);
if (charCount[char] === 1) {
return i;
}
}
return -1;
}
该方法的时间复杂度是O(n),比暴力解决法的时间复杂度低得多。
我们也可以利用Set来存储重复的字符,然后对于没有出现在Set中的字符,找到它在字符串中的位置即可。
function firstNonRepeatingChar3(str) {
let seenChars = new Set();
let repeatedChars = new Set();
for (let i = 0; i < str.length; i++) {
let char = str.charAt(i);
if (seenChars.has(char)) {
repeatedChars.add(char);
} else {
seenChars.add(char);
}
}
for (let i = 0; i < str.length; i++) {
let char = str.charAt(i);
if (!repeatedChars.has(char)) {
return i;
}
}
return -1;
}
该方法的时间复杂度和方法二类似,但是代码更简洁。
综上所述,以上三种方法都是可以实现字符串中第一个非重复字符位置的。具体方法的选择取决于实际情况,如处理字符串的长度、是否需要对字符串进行修改等。我们可以根据需要自行选择。