Нахождение самой длинной непрерывной струны внутри струны и стирание ее - PullRequest
0 голосов
/ 19 ноября 2018

Мне было интересно, так как я не мог найти ни одной подобной темы, как лучше найти непрерывные строковые шаблоны в строке и стереть их из нее.

Что я имею в виду под этим: У меня есть строка: "AAAAaaCCCCCCcDDDEEEE", и я хотел бы найти самую длинную такую ​​же непрерывную строку, и это было бы, поскольку C встречается 6 раз, а затем удалить ее из строки, чтобы я получил "AAAAaacDDDEEEE", а затем сделать это снова и снова, пока не будет только одна непрерывная строка. Я пытался сделать это самостоятельно, но кажется, что требуется больше строк кода, к чему призывает его простота,

Пожалуйста, помогите

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Другой вариант - просто старомодный цикл while.Это будет иметь значительно большую производительность, чем использование регулярных выражений, за счет большего количества кода и (немного) меньшей читабельности:

let s = "AAAAaaCCCCCCCcDDDEEEE"

let start = 0, max = 0, current = 0, maxStart = 0
while(current <= s.length) {
  if (s[current] !== s[start]){   
    if (current - start > max){
      max = current - start 
      maxStart = start
    }
    start = current
  }
  current++
}

// the found string:
console.log(s.substring(maxStart, maxStart+max))

// delete
s = s.slice(0,maxStart) + s.slice(max + maxStart) 
console.log(s)
0 голосов
/ 19 ноября 2018

Вы можете использовать регулярное выражение для получения массива цепочек. Получите длину самой длинной цепи с Math.max() и Array.map(). Используйте Array.filter(), чтобы удалить самые длинные цепочки, и затем объедините обратно в строку с Array.join().

Это будет обрабатывать несколько длинных цепей одинаковой длины.

const removeLongest = (str) => {
  const chains = str.match(/(.)\1*/g); // get an array of chains
  const longest = Math.max(...chains.map(s => s.length)); // find the longest chain length
  return chains.filter(({ length }) => length !== longest) // remove longest chains
    .join(''); // convert array back to string
};
   
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEE')); // AAAAaacDDDEEEE
console.log(removeLongest('AAAAaaCCCCCCcDDDEEEEEE')); // AAAAaacDDD
0 голосов
/ 19 ноября 2018

Вы можете найти непрерывные символы и заменить их пустой строкой.

var string = "AAAAaaCCCCCCcDDDEEEE",
    longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    
console.log(longest);

string = string.replace(longest, '');

console.log(string);

С функцией.

function remove(string) {
    var longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);

    while (longest.length > 1) {
        string = string.replace(longest, '');
        longest = string.match(/(.)\1*/g).reduce((a, b) => a.length > b.length ? a : b);
    }
    return string;
}
    
console.log(remove("AAAAaaCCCCCCcDDDEEEE"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...