Задача о наибольшей подпоследовательности-палиндроме
Например, HELOLEH является подпоследовательностью-палиндромом строки HTEOLFEOLEH.
| Задача: |
| Задача о наибольшей подпоследовательности-палиндроме — это задача о поиске наибольшей подпоследовательности, которую можно получить вычеркиванием некоторых букв из данной последовательности таким образом, что оставшаяся подпоследовательность будет палиндромом. |
Решение
Обозначим данную последовательность через [math]S[/math] , а ее элементы — через [math]S[i], 0 \leqslant i \leqslant n — 1[/math] , где [math]n[/math] — длина строки [math]S[/math] . Будем рассматривать возможные подпоследовательности данной последовательности с [math]i — [/math] го по [math]j — [/math] ый символ включительно, обозначив её как [math]S(i, j)[/math] . Длины максимальных подпалиндромов для данной последовательности будем записывать в двумерный массив [math]L[/math] : [math]L[i][j][/math] — длина максимальной подпоследовательности-палиндрома, который можно получить из последовательности [math]S(i, j)[/math] .
Начнем решать задачу с простых подпоследовательностей. Для последовательности из одного элемента (то есть подпоследовательности вида [math]S(i, i)[/math] ) ответ очевиден — ничего вычеркивать не надо, такая строка будет искомой подпоследовательностью-палиндромом. Для последовательности из двух элементов [math]S(i, i + 1)[/math] возможны два варианта: если элементы равны, то мы имеем подпоследовательность-палиндром, ничего вычеркивать не надо. Если же элементы не равны, то вычеркиваем любой.
Пусть теперь нам дана подпоследовательность [math]S(i, j)[/math] . Если [math]S[i][/math] и [math]S[j][/math] элементы подпоследовательности не совпадают, то один из них нужно вычеркнуть. Тогда у нас останется подпоследовательность [math]S(i, j — 1)[/math] или [math]S(i + 1, j)[/math] — то есть мы сведем задачу к подзадаче: [math]L[i][j] = \max(L[i][j — 1], L[i + 1][j])[/math] . Если же первый и последний элементы равны, то мы можем оставить оба, но необходимо знать решение задачи [math]S(i + 1, j — 1):L[i][j] = L[i + 1][j — 1] + 2[/math] . Таким образом получаем следующее рекуррентное соотношение:
[math] L[i][j] = \begin 1, & i = j\\ 0, & i \gt j\\ L[i + 1][j — 1] + 2, & s[i] = s[j] \\ \max(L[i][j — 1], L[i + 1][j]), & s[i] \neq s[j] \end [/math]
Асимптотика
Каждый элемент массива мы вычисляем [math]1[/math] раз за [math]O(1)[/math] обращаясь к уже вычисленным элементам. Так как размер массива [math]n \times n[/math] , то алгоритм работает за [math]O(n^2)[/math]
Пример
Рассмотрим решение на примере последовательности ABACCBA. Первым делом заполняем диагональ массива единицами, они будут соответствовать подпоследовательностями [math]S(i, i)[/math] из одного элемента. Затем начинаем рассматривать подпоследовательности длины два. Во всех подпоследовательностях, кроме [math]S(3, 4)[/math] , элементы различны, поэтому в соответствующие ячейки запишем [math]1[/math] , а в [math]L[3][4][/math] — [math]2[/math] .
Получается, что мы будем заполнять массив по диагоналям, начиная с главной диагонали. Для подпоследовательностей длины [math]3[/math] получаются следующие значения: в подпоследовательности ABA первый и последний элемент равны, поэтому [math]L[0][2] = L[1][1] + 2[/math] . В остальных подпоследовательностях первый и последний элементы различны.
BAC: [math]L[1][3] = \max(L[1][2], L[2][3]) = 1[/math]
ACC: [math]L[2][4] = \max(L[2][3], L[3][4]) = 2[/math]
CCB: [math]L[3][5] = \max(L[3][4], L[4][5]) = 2[/math]
CBA: [math]L[4][6] = \max(L[4][5], L[5][6]) = 1[/math]
Продолжая далее аналогичные рассуждения, заполним все ячейки над диагональю и в ячейке [math]L[0][6][/math] получим ответ — [math]6[/math] .
Если же в задаче необходимо вывести не длину, а саму подпоследовательность-палиндром, то дополнительно к массиву длин мы должны построить массив переходов — для каждой ячейки запомнить, какой из случаев был реализован.
Последовательность заполнения массива и массив переходов см. на изображениях ниже.
Псевдокод
Перед вызовом процедуры заполняем [math]L[][][/math] начальными значениями: [math]L[i][j] = 1[/math] если [math]i=j[/math] , [math]L[i][j] = 0[/math] , если [math]i\gt j[/math] , в остальных случаях [math]L[i][j]=-1[/math] . При первом вызове функции в качестве аргументов передаем индексы первого и последнего элементов исходной строки. Например для строки длиной [math] N [/math] вызов функции будет иметь следующий вид: [math] \mathrm
Функция для вычисления длины палиндрома:
- Границы исходной последовательности: [math] \mathtt[/math]
int palSubSeq(left: int, right: int): if L[left][right] == -1 if s[left] == s[right] L[left][right] = palSubSeq(left + 1, right - 1) + 2 else L[left][right] = max(palSubSeq(left + 1, right), palSubSeq(left, right - 1)) return L[left][right]
Процедура для построения искомого палиндрома:
- Границы исходной последовательности: [math] \mathtt[/math]
- Границы искомой подпоследовательности-палиндрома, где правой границей будет длина найденного палиндрома: [math] \mathtt[/math]
// palindrome — массив символов, где в palindrome[i] содержится символ искомой последовательности-палиндрома palChars(left: int, right: int, palLeft: int, palRight: int): while left right if left == right and L[left][right] == 1 palindrome[palLeft++] = S[left++] else if S[left] == S[right] palindrome[palLeft++] = S[left++] palindrome[palRight--] = S[right--] else if L[left + 1][right] L[left][right - 1] left++ else right--
См. также
- Задача о наибольшей общей подпоследовательности
- Задача о наибольшей возрастающей подпоследовательности
- Задача о наибольшей общей палиндромной подпоследовательности
Источники информации
- Википедия — Палиндром
- Wikipedia — Palindrome
- Wikipedia — Longest palindromic subsequence
Поиск файлов в директории по первым буквам их имен
Вообщем проблема вот в чем — Есть текстбокс который называется «Поиск». Короче смысл такой же как и у эксплорера. банальный поиск файла в конкретной директории по первым буквам. А в идеале так же как и в ХР — можно в названии файла, а можно и в самом файле. Вывод будет в ListView, но это я уж сам сделаю, не проблема.
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Поиск имен в Dictionary по первым двум буквам
Задание такое: "В отпуске Вася не тратил время зря, а заводил новые знакомства. Он знакомился с.
Поиск и автоматический переход в списке по первым буквам их имен
Добрый вечер . Имеется форма по коду или названию выбираем товар и заносим в таблицу . Как.

Поиск слова по первым 5 буквам
Есть база слов, все слова разной длинны, находятся в текстовом документе на раб. столе. Я открываю.
Поиск по первым буквам в StringGrid
Здравствуйте есть база данных StringGrid, есть поиск , но как сделать что бы искало по первым.
1080 / 1007 / 106
Регистрация: 28.02.2010
Сообщений: 2,889
Пример поиска. То что нужно найти — ineedthis.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
using System; using System.Collections.Generic; using System.IO; class Program { static Liststring> lst; static string ineedthis; static void Main(string[] args) { lst = new Liststring>(); ineedthis = "readme_en.txt"; search("Z:\\"); for (int i = 0; i lst.Count; i++) { Console.WriteLine(lst[i]); } } static void search(string dir) { string[] subdirs = Directory.GetDirectories(dir); string[] foundfiles = Directory.GetFiles(dir, ineedthis); for (int i = 0; i foundfiles.Length; i++) { lst.Add(foundfiles[i]); } for (int i = 0; i subdirs.Length; i++) { search(subdirs[i]); } } }
2364 / 1242 / 78
Регистрация: 28.10.2009
Сообщений: 4,331
kOS_77, примерно так, только вместо ListView используется ListBox
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
Imports System.IO Public Class Form1 Dim dir As String Dim dirInfo As DirectoryInfo Private Sub TextBox2_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox2.TextChanged ListBox1.Items.Clear() If TextBox2.Text = "" Then Exit Sub For Each fileIn As FileInfo In dirInfo.GetFiles() If fileIn.Name.StartsWith(TextBox2.Text) Then ListBox1.Items.Add(fileIn.Name) End If Next End Sub Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged dir = TextBox1.Text If Directory.Exists(dir) Then TextBox2.Enabled = True dirInfo = New DirectoryInfo(dir) Else MessageBox.Show("Эта папка не существует") End If End Sub End Class
Программка в прикреплении
Вложения
| FileSearch.zip (9.6 Кб, 54 просмотров) |
Как организовать поиск по первым буквам запроса через input javascript
Прилагаю свой вариант, но он работает только для первого символа, дальше не получается организовать вывод (только начала изучать javascript).
1 2 3 4 5 6 7 8 9 10 11
document.getElementById('termDropList').innerHTML = ''; for (var i = 0; i terms.length; i++) { var A = String.fromCharCode(event.keyCode).toLowerCase(); var B = terms[i]; if (A.charCodeAt(0) === B.charCodeAt(0)) { document.getElementById('termDropList').innerHTML += ' + B + ''; } }
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Как сделать поиск по первым буквам слов?
Делаю поиск по буквам. При вводе в эдит буквы "в" в таблице выводит и иванова, и петрова, и.
Как мне организовать поиск и вывести информацию из таблицы по начяльным буквам поиска?
Подскажите пожалуйста как мне организовать поиск и вывести всю информацию из таблицы там где есть.
Поиск по первым буквам в StringGrid
Здравствуйте есть база данных StringGrid, есть поиск , но как сделать что бы искало по первым.
Поиск по первым буквам слова
Добрый день. Подскажите пожалуйста код для поиска по первым буквам слова. В компонент tableView_5.
2169 / 1652 / 840
Регистрация: 10.01.2015
Сообщений: 5,186
Не совсем понятно задание. Пока как пример. Вероятно, поможет.
1 2 3 4
var arr = ['фыв','пыв','выв','фвап']; for (var i = 0; i arr.length; i++){ if(arr[i][0] === 'ф') console.log(arr[i]); //вернет фыв и фвап }
Регистрация: 19.11.2016
Сообщений: 10
Пользователь в input с типом search вводит значение. Первый символ считывает и выводит из массива все элементы совпадающее по первому символу (так в моем коде). НО необходимо сделать так, что бы после следующих введенных символов выводился соответствующий елемент из массива (к примеру, выплывающая подсказка при вводе символов в гугле) и так далее.
![]()
![]()
![]()
1846 / 1342 / 599
Регистрация: 12.01.2011
Сообщений: 5,432
div id='result'>/div> input type='search' id='search' placeholder="Текст">
1 2 3 4 5 6 7 8 9 10 11 12 13
var arr = ['add','remove','classlist','lol','sap','sanek','left','width'] document.getElementById('search').onkeyup = function(){ document.getElementById('result').innerHTML = ''; var l = this.value.length; if(l>0){ for(var i=0;iarr.length;i++){ var _ = arr[i].split('').slice(0,l).join(''); if(_==this.value){ document.getElementById('result').innerHTML+=arr[i]+'
'; } } } };
Регистрация: 19.11.2016
Сообщений: 10
Прошу прощения, необходимо было изначально прикрепить скриншот для того, чтобы наглядно показать что мне необходимо.
Необходимо чтобы после ввода символов из масива подбирались элементы, присутствующие в нём. У меня получилось сделать только для первого символа, далее при вводе (к примеру, «ау») ничего не показывает, но должно показывать аудио.
Надеюсь я более ясно изъяснилась. Благодарю за ответы!
![]()
![]()
![]()
1846 / 1342 / 599
Регистрация: 12.01.2011
Сообщений: 5,432

Сообщение было отмечено John_cher как решение
Решение
Это называется живой поиск. Добавить стили для моего варианта, и будет тоже самое.
Добавлено через 20 минут
Сообщение от John_cher 
У меня получилось сделать только для первого символа
А у меня показывает введите например a а потом au
https://jsfiddle.net/2k08moeo/4/
Регистрация: 19.11.2016
Сообщений: 10
Большое Вам спасибо, все получилось!
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Поиск слова по первым 5 буквам
Есть база слов, все слова разной длинны, находятся в текстовом документе на раб. столе. Я открываю.
Поиск по первым буквам из формы!
Есть массив, в нём имена. Надо чтобы "что-то" выводило те имена у которых начало на букву "А". .

Поиск записей в списке по первым буквам
всем привет. вопрос конечно глупый, но не тривиальный. на форме Главная есть список0 со.
Поиск по первым буквам в классе Dictionary
Привет всем! В общем есть пара вопросов: 1) как сделать поиск по первым словам в слове как на.
Поиск ответа
Здравствуйте! Как правильно произносить название буквы Фэ или Эф. Я с детства запомнила первый вариант, поэтому второе произношения режет слух. Спасибо!
Ответ справочной службы русского языка
Название этой буквы – [эф]. Но в некоторых аббревиатурах она произносится [фэ], например ФБР [фэ-бэ-эр], ФРГ [фэ-эр-гэ].
| Вопрос № 285993 |
Имеет ли слово хиреть отношение к слову хер ( название буквы ) в плане происхождения?
Ответ справочной службы русского языка
Нет, у этих слов разное происхождение. Хиреть восходит к той же основе, что и хворый, хворать.
| Вопрос № 284505 |
Как правильно произносить названия следующих букв: й — и с краткой, и краткая, и краткое или ий; э — э или э оборотное. Как правильно писать названия следующих букв: ж — же или жэ (второй вариант кажется невероятно сомнительным с точки зрения графического облика) ц — це или цэ (та же причина).
Ответ справочной службы русского языка
1. Энциклопедия «Русский язык» под ред. Ю. Н. Караулова (М., 1997) о букве Й сообщает следующее: с начала XVIII в. буква Й называлась «и с краткой » по значку «кратка » над буквой; во второй половине XIX в. по предложению Я. К. Грота стала называться «и краткое »; во второй половине ХХ в. возникло новое название «й » (читается [ий]). Во многих современных словарях и справочниках эту букву продолжают именовать «по Гроту» – «и краткое». См., напр.: «Большой академический словарь русского языка» (Т. 7. М., СПб., 2007) и « Правила русской орфографии и пунктуации. Полный академический справочник » (под ред. В. В. Лопатина. М., 2006). Таким образом, следует признать, что сейчас допустимо два названия для буквы Й – «и краткое » и «й ».
2. Современное название буквы Э – «э » (читается [э]), а название «э оборотное» – старое. См. источники, указанные выше.
3. О названиях букв Ж и Ц можно прочитать в ответе на вопрос № 282817.
| Вопрос № 282760 |
Здравствуйте!
У нас на работе есть ПСГ (питатель сетевой горизонтальный). Все произносят его, как пэСЭгэ. Я произношу пэЭСгэ, но мне говорят, что это режет слух. Кто прав?
Ответ справочной службы русского языка
Название буквы с – [эс]. Если в состав инициальной аббревиатуры входят только буквы, обозначающие согласные звуки, то такая аббревиатура обычно читается по названиям составляющих ее букв, ср.: СССР [эс-эс-эс-эр], НТВ [эн-тэ-вэ], РПЦ [эр-пэ-цэ].
Правда, при произношении ряда аббревиатур используются разговорные названия букв: [нэ] вместо [эн], [сэ] вместо [эc], [фэ] вместо [эф] и т. д., например: США [сэ-шэ-а], ФБР [фэ-бэ-эр]. Однако на это влияет многолетняя традиция употребления таких аббревиатур и их широкая распространенность. Вряд ли ПСГ можно отнести к аббревиатурам такого типа. Поэтому более правильным представляется произношение [пэ-эс-гэ].
| Вопрос № 282583 |
Скажите, пожалуйста, верно ли, что отныне принято букву алфавита называть не «эль», а «эл»?
Ответ справочной службы русского языка
Название «эл» распространяется всё активнее, но при этом вариант «эль» тоже никто не отменял. Согласно «Большому академическому словарю русского языка» (Т. 9. М., СПб., 2007), название буквы л может произноситься двояко: «эл» и «эль».
| Вопрос № 270756 |
Здравствуйте, помогите, пожалуйста разобраться .Ребёнку в 1 кл. задали домашнее задание: под картинкой написать буквы алфавита, например нарисован аист — пишем букву А , и т. д. по алфавиту. А вот для Ъ, Ы и Ь — картинок нет. Понятно, что слов начинающихся на Ъ и Ь нет. ВОТ В ЧЁМ ОСНОВНОЙ ВОПРОС : Есть ли слова на букву — Ы в русском языке . В задании сказано, найти слова начинающиеся на эти буквы и нарисовать к ним картинки. Заранее , спасибо!
Ответ справочной службы русского языка
Слова на букву Ы в русском языке есть, но картинки к ним нарисовать сложно. Слова на буквы Ы: ыр (песня у некоторых тюркских народов), ыкать (произносить звук ы), ыканье (произнесение звука ы). Кроме того, само название буквы Ы является словом – несклоняемым существительным среднего рода ы. В принципе, можно нарисовать под буквой Ы восточного сказителя, исполняющего песню, но вряд ли такие познания требуются от первоклассника. Скорее всего, эту букву можно пропустить.
| Вопрос № 266776 |
Скажите, пожалуйста, как правильно произносятся аббревиатуры с буквой Л, например, ВЛКСМ, ВХЛ? Вопрос возник в связи с тем, что у вас на сайте обозначено, что эта буква произносится как «эль», а привычнее говорить «вэ-эл-ка-эс-эм». Спасибо!
Ответ справочной службы русского языка
В аббревиатурах традиционно произносят «эл»: [вэ-эл-ка-эс -э м], [вэ-ха-эл], [жэ-зэ-эл]. Но название буквы – «эль».
| Вопрос № 254659 |
Почему при произнесении буквы русского алфавита «Э» добавляется «оборотное»? Спасибо!
Ответ справочной службы русского языка
Название «э оборотное» – старое, традиционное название буквы Э, оно соотносит начертание буквы с «перевернутой» кириллической буквой Е. Сейчас при перечислении букв русского алфавита добавлять слово «оборотное» необязательно.
| Вопрос № 221946 |
Добрый день! Очень часто слышу в СМИ произношение эФСБ. Правильно ли это и в связи с чем? Притом, что в школе нас учили произносить алфавит иначе: «. У,Фэ,Ха, Цэ. » Спасибо.
Ответ справочной службы русского языка
Название буквы _ф_ — _эф_. В некоторых аббревиатурах эта буква читается [фэ]. _ФСБ_ произносится [эф-эс-бэ], допустимо [фэ-эс-бэ].
| Вопрос № 207035 |
В ответе на вопрос №206890 я прочитал: Й (И краткое), а я всгда считал, что Й — И краткий
Ответ справочной службы русского языка
Правильное название буквы Й — «и краткое». Названия букв в русском языке (кроме Ъ и Ь) — среднего рода.
| Вопрос № 201894 |
Есть ли в русском языке слова, начинающиеся на букву «ы» и не собственные? корректно ли слово змееед?
Ответ справочной службы русского языка
Да, такие слова есть. В «Русском орфографическом словаре РАН» зафиксированы междометие _ых_; глагол _ы/кать_ (произносить звук _ы_) и производное от него существительное _ы/канье_; существительное _ыр_ (песня у некоторых тюркских народов). Кроме того, нельзя забывать, что и само слово _ы_ — название буквы — является несклоняемым существительным среднего рода.
В «Русском орфографическом словаре РАН» зафиксировано: _змееяд_.
| Вопрос № 200904 |
Здравствуйте! Помогите, пожалуйста, разобраться в ситуации. Подруга спросила: «Какого хера ты ходила в курилку?» Я сказала, что не стоит ругаться матом. Несколько человек в один голос закричали, что «хер» — это не мат. Подскажите, пожалуйста, в том контексте, который я привела, является ли это слово «матерным»? Ругательным, думаю, является однозначно.
Ответ справочной службы русского языка
Слово _хер_, а также производные от него _херня, херовый_ и пр. к матерным не относятся. Это, безусловно, очень грубое, бранное вульгарное слово, однако оно входит в словари арго и толковые словари, куда матерные слова не включаются.
Интересно происхождение этого слова: _хер_ — название буквы кириллицы Х, поэтому слово возникло как эвфемизм к нецензурному, начинающемуся на ту же букву.