Определить минимальное количество символов,по которым можно разлечить слова.
Строка состоит из нескольких слов, разделенных пробелом. Определить минимальное количество первых символов слов, по которым можно различить слова в строке.
Входные данные: abc5 abc0 abcde abcfg Выходные данные: 4 Вот наработки: let words = []; let res = []; let i; let counter = 0; let matrix = []; let val1 = "abc5 abc0 abcde abcfg"; if ($('#val1').val() == '') alert('Введите данные') else { words = val1.split(' '); for (let i = 0; i < words.length; i++) { for (let j = 0; j < words[i].length; j++) { matrix[i] = words[i].split(''); } } let matrxLength = matrix.length; for (let word = 0; word <=matrxLength+1; word++) { for (let sym = 0; sym < matrix[word].length; sym++) { console.log(matrix[word][sym]); if (matrix[word][sym] == matrix[word+1][sym]) { if (res.includes(matrix[word][sym]) != true) { console.log(res); res.push(matrix[word][sym]) } } } } // console.log(matrix); // console.log(res); } }); и еще один вариант: for (let i = 0; i < words.length; i++) { for (let j = 0; j < words[i].length; j++) { matrix[i] = words[i].split(''); } } console.log(matrix[0][0]); for (let word in matrix) { for (let symbol in matrix[word]) { if (matrix[word][symbol]==matrix[++word][symbol]){ if (res.includes(matrix[word][symbol])!=true){ console.log(res); res.push(matrix[word][symbol]) } } } } }; console.table(matrix); console.log(res); }); |
Hokage777,
вариант ... let val1 = "abc5 abc0 abcde abcfg"; const fn = str => { let words = str.split(/\s+/).sort((a,b)=> a.length - b.length); let word = words[0]; for(let a of words){ a = [...a]; let temp = ""; for(b of word){ if(b == a.shift()) temp += b; else break; } if(temp) word = temp; else return 0 } return word.length + 1 } console.log(fn(val1)) |
Цитата:
вариант рони соответствует первому условию, т.е. для строки 'a5 abc0 abcde abcfg' он вернет 2, чего достаточно, чтобы различить первое и второе слово, но не хватит при сравнении 2 и 3 слов |
Цитата:
let val1 = "abc5 abc0 abcde abcfg"; let val2 = "a5 abc0 abcde abcfg"; const fn = str => { let words = str.split(/\s+/); let length = Math.max(...words.map(_=>_.length)), i = 0; k: for (; i < length; i++) { let temp = ""; for(let a of words){ if (a[i] !== void 0){ if(temp.includes(a[i])) continue k; temp += a[i]; } } return ++i } return i } console.log(fn(val1)) console.log(fn(val2)) |
var s = ' abcde abc5 abc0 abcfg'.trim(), w = s.split(/\s+/); for(var i=1; i < w[0].length; ++i) if(s.match(new RegExp('\\b'+w[0].substr(0, i), 'g')).length < w.length) break; console.log(i) |
И ещё один вариант:
var str = " abc5 abc0 abcde abcfg"; var match = str.match(/^\s*(\S*)\S*(?:\s+\1\S*)*\s*$/); var length = match ? match[1].length + 1 : 0; console.log(length); |
Malleys,
var str = " abc5 abc0 abcde abcdg"; var match = str.match(/^\s*(\S*)\S*(?:\s+\1\S*)*\s*$/); var length = match ? match[1].length + 1 : 0; console.log(length); //4 а нужно 5 |
Цитата:
Получается нужно найти длину не наименьшей части подстроки, которая встречается в каждом слове, а такую длину L подстроки, которая однозначно определяла бы любое слово, в случае, если взять в нём не менее L символов. Если пример от laimas запустить с s = ' w abcde abc5 abc0 abcfg', то он тоже показывает удивительнейшие вещи! Например, то, что человек, пропагандирующий уникальные идентификаторы, может продвигать решение, где они как раз-таки и не уникальные! (Нужно ведь идентифицировать слово) Если поглядеть в пример от рони то совершенно не понятно, почему там получается 4, когда рони упорно провозглашает, что Цитата:
Цитата:
И laimas опубликовал решение раньше, а вы превзошли в правдивости всех! рони, так значит в сообщениях №2, 5 и 6 находят длину наименьшей части подстроки, которая встречается в каждом слове? рони, а вы потрясающе деструктурируете! Вот вычисление такой длины L подстроки, которая однозначно определяла бы любое слово, в случае, если взять в нём не менее L символов... (без деструктуризации!) function fn(str) { var length = 0; str.trim().split(/\s+/).sort(function(as, bs) { var i = Array.prototype.findIndex.call(as, (a,i) => bs[i] !== a) length = Math.max(length, 1 + i) return as > bs ? 1 : -1 }) return length } console.log( fn("abc5 abc0 abcde abcfg"), fn("a5 abc0 abcde abcfg"), fn(" abcde abc5 abc0 abcfg") ) // включает все строки, упоминавшиеся в теме Удивительно, упорно получается 4. |
Цитата:
|
Цитата:
Цитата:
что не так с результатом 5!!! если ваш новый код даёт тоже 5!!! function fn(str) { var length = 0; str.trim().split(/\s+/).sort(function(as, bs) { var i = Array.prototype.findIndex.call(as, (a,i) => bs[i] !== a) length = Math.max(length, 1 + i) return as > bs ? 1 : -1 }) return length } console.log( fn(" abc5 abc0 abcde abcdg") ) // 5 P.S. Malleys, вероятно вы не заметили разницу в строке пост #7 и пост #6 |
Часовой пояс GMT +3, время: 04:58. |