📌  相关文章
📜  字符串中的第一个非重复字符位置 - Javascript (1)

📅  最后修改于: 2023-12-03 15:25:02.827000             🧑  作者: Mango

字符串中的第一个非重复字符位置 - Javascript

在处理字符串时,有时我们需要找到第一个非重复的字符在字符串中的位置。这个过程可以用多种方法实现。下面我们将介绍一些解决方案,并提供相应的代码示例。

方法一:暴力解决法

该方法是最简单、最直接的方法,它的思路是:对于字符串中的每一个字符,统计它在字符串中出现的次数,如果只出现了一次,那么就是我们要找的第一个非重复字符。

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来存储重复的字符,然后对于没有出现在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;
}

该方法的时间复杂度和方法二类似,但是代码更简洁。

综上所述,以上三种方法都是可以实现字符串中第一个非重复字符位置的。具体方法的选择取决于实际情况,如处理字符串的长度、是否需要对字符串进行修改等。我们可以根据需要自行选择。