Взвешенные однородные строки в JavaScript HackerRank: методы и примеры кода

Чтобы решить проблему «взвешенных однородных строк» ​​на HackerRank с помощью JavaScript, вы можете использовать различные подходы. Задача состоит в том, чтобы определить, является ли строка «однородной», на основе веса, присвоенного каждому символу в строке. Вот несколько способов решения этой проблемы, а также примеры кода:

Метод 1: метод грубой силы

function weightedUniformStrings(s, queries) {
  const weights = new Set();
  let currentWeight = 0;

  for (let i = 0; i < s.length; i++) {
    currentWeight = s.charCodeAt(i) - 96; // assuming lowercase characters

    let j = i + 1;
    while (j < s.length && s.charCodeAt(j) - 96 === currentWeight) {
      j++;
    }

    for (let k = i; k < j; k++) {
      weights.add(currentWeight * (k - i + 1));
    }

    i = j - 1;
  }
  const result = [];
  for (let query of queries) {
    result.push(weights.has(query) ? 'Yes' : 'No');
  }

  return result;
}
const s = "abccddde";
const queries = [1, 3, 12, 5, 9, 10];
console.log(weightedUniformStrings(s, queries));

Метод 2: подход с суммой префиксов

function weightedUniformStrings(s, queries) {
  const weights = new Set();
  let currentWeight = 0;
  let count = 0;

  for (let i = 0; i < s.length; i++) {
    if (s[i] === s[i - 1]) {
      count++;
    } else {
      count = 1;
      currentWeight = s.charCodeAt(i) - 96; // assuming lowercase characters
    }

    weights.add(currentWeight * count);
  }
  const result = [];
  for (let query of queries) {
    result.push(weights.has(query) ? 'Yes' : 'No');
  }

  return result;
}
const s = "abccddde";
const queries = [1, 3, 12, 5, 9, 10];
console.log(weightedUniformStrings(s, queries));

Метод 3: подход динамического программирования

function weightedUniformStrings(s, queries) {
  const weights = new Set();
  const dp = new Array(26).fill(false);
  let currentWeight = 0;

  for (let i = 0; i < s.length; i++) {
    if (s[i] === s[i - 1]) {
      currentWeight += s.charCodeAt(i) - 96; // assuming lowercase characters
    } else {
      currentWeight = s.charCodeAt(i) - 96; // assuming lowercase characters
    }

    dp[currentWeight] = true;
  }

  for (let query of queries) {
    weights.add(query);
  }
  const result = [];
  for (let weight of weights) {
    result.push(dp[weight] ? 'Yes' : 'No');
  }

  return result;
}
const s = "abccddde";
const queries = [1, 3, 12, 5, 9, 10];
console.log(weightedUniformStrings(s, queries));