Слайд 3
Класс String является основным классом, предназначенным для хранения
и обработки строк символов. Для создания экземпляров класса String
может быть использован один из следующих конструкторов:
String()
String(String str)
String(StringBuffer strbuf)
String(char[] arr)
String(char[] arr, int first, int count)
Первый из них создаёт пустую строку, второй и третий копируют содержимое объектов классов String и StringBuffer в созданный объект. Последние два конструктора позволяют создать строку на основе символьного массива или его части. Кроме того, любая объектная ссылка типа String может быть проинициализирована посредством присвоения ей строкового литерала, например:
String filename = "data.txt";
Слайд 4
Особенностью класса String является то, что экземпляры этого
класса не могут быть изменены после их создания. Однако
это не создаёт ограничений для их использования, поскольку все методы, которые должны были бы изменять строку, просто создают новую модифицированную строку, оставляя исходную без изменений. Поясним работу этого механизма на примере:
String s = "abcd";
s = s.toUpperCase();
Здесь метод toUpperCase() создаёт новую строку, содержащую последовательность символов "ABCD", и возвращает ссылку на эту строку, которая присваивается переменной s, старое значение переменной теряется. Исходная строка остаётся в неизменном виде и, поскольку на неё больше не осталось объектных ссылок, будет удалена сборщиком мусора.
Слайд 5
Основные методы класса String
Слайд 7
Преобразование к строке
Класс String является в некотором
смысле исключительным классом в Java, поскольку любой тип данных
может быть преобразован к нему.
Для примитивных типов такое преобразование даёт их естественное строковое представление, для объектов вызывается метод toString(), определённый в классе Object и, следовательно, присутствующий в любом классе Java.
Слайд 8
Конкатенация строк
Для строк определена операция конкатенации, обозначаемая
знаком +.
Это бинарная операция, один из аргументов которой
должен иметь тип String. Она осуществляет автоматическое преобразование другого аргумента к типу String (если это необходимо) и слияние полученных строк. Это единственный случай, когда преобразование к строке осуществляется неявно.
Существует также операция конкатенации с присваиванием +=, первый аргумент которой должен иметь тип String, а второй может быть произвольным. При выполнении операции он будет преобразован к типу String.
Слайд 9
Задание
Реализовать алгоритм поиска подстрок с помощью конечного автомата
Слайд 10
Постановка задачи
Пусть у нас есть две строки:
текстовая строка Т и шаблонная строка Р. Надо найти
все вхождения Р в Т.
Если текст и шаблон состоят из n и m символов соответственно, то m ≤ n.
Решением будут все величины сдвигов Р относительно начала Т, отмечающие, где шаблон располагается в тексте: шаблон Р встречается в тексте со сдвигом s, если подстрока Т, которая начинается с s+1, в точности такая же, как и шаблон Р.
Минимально возможный сдвиг — нулевой. Так как шаблон не должен выходить за пределы текста, максимально возможный сдвиг равен n-m.
Слайд 11
Конечный автомат
КА — это набор некоторых состояний,
а путь от состояния к состоянию основан на последовательности
входных символов.
КА начинает работу с определенного состояния и по одному получает входные символы. Основываясь на состоянии, в котором он находится, и полученном символе, конечный автомат переходит в новое состояние.
Слайд 12
КА в случае поиска подстрок
Входная последовательность: символы
текста T.
Число состояний КА: m+1 состояние (на 1
больше, чем количество символов в шаблоне Р), пронумерованное от 0 до m.
КА начинает работу из состояния 0.
Когда он находится в состоянии k, k последних считанных символов текста соответствуют первым k символам шаблона.
Всякий раз, когда КА входит в состояние m, он встретил в тексте весь шаблон.
КА хранит таблицу next-state, которая индексируется всеми состояниями и всеми возможными входными символами. Значение next-state[s,a] представляет собой номер состояния, в которое перейдет КА, если в настоящее время он находится в состоянии s и получил из текста символ а.
Слайд 13
Пример
Входной текст: GTAACAGTAAACG.
Шаблон: ААС.
Круги
представляют состояния.
Помеченные символами стрелки показывают, как КА переходит
из одного состояния в другое при получении входных символов.
Выделенный толстыми стрелками "позвоночник" при прочтении слева направо дает шаблон ААС.
Слайд 14
Входной текст: GTAACAGTAAACG.
Шаблон: ААС.
КА
перемещается на одно состояние вправо для каждого символа, который
соответствует шаблону, а для каждого символа, который ему не соответствует, он переходит влево или остается в том же состоянии.
Всякий раз, когда в тексте встречается шаблон, КА перемещается вправо по одному состоянию для каждого символа, пока не достигнет последнего состояния, где он объявляет, что найдено вхождение шаблона в текст.
Если стрелка отсутствует (например, стрелки, помеченные Т), соответствующий переход ведет в состояние 0.
Слайд 15
Таблица next-state:
Перемещение КА по состояниям при считывании
символов из входного текста:
Входной текст: GTAACAGTAAACG.
Шаблон:
ААС.
Слайд 16
Процедура поиска подстрок
Процедура String-Matcher(T, next-state, m, n).
Вход:
•
Т, n – строка текста и ее длина,
• next-state
– таблица переходов между состояниями, построенная для заданного шаблона,
• m – длина шаблона. Строки таблицы next-state индексированы от 0 до m, а столбцы индексированы символами, которые могут встретиться в тексте.
Выход: выводит все величины сдвигов, при которых в тексте встречается искомый шаблон.
Слайд 17
Шаги процедуры:
1. Установить переменную state равной нулю.
2. Для
i = 1 до n:
A. Установить значение state равным
next-state[state, ti].
B. Если state = m, вывести сообщение
"Шаблон найден со сдвигом " i-m.
Слайд 18
Несколько определений
Префикс Рi шаблона Р представляет собой
подстроку, состоящую из первых i символов Р.
Определим суффикс
шаблона как подстроку символов с конца Р. Например, AGA — суффикс шаблона ACACAGA.
Определим конкатенацию строки X и символа а как новую строку, получающуюся путем добавления а к концу X, и будем обозначать ее как Ха.
Слайд 19
Определение нового состояния
Если в состоянии k мы
считали из текста префикс Рk, т.е. последние k считанных
символов текста совпадают с первыми k символами шаблона.
Когда мы считываем следующий символ, скажем, a, мы считываем из текста строку Рkа (конкатенация Рk с а).
Префикс Р, считанный нами в этот момент, находится в конце Рkа, т.е. префикс Р должен являться суффиксом Рkа. Длина этого префикса и является номером следующего состояния.
Когда наидлиннейший префикс Р, который одновременно является суффиксом Рkа, оказывается пустой строкой, мы устанавливаем next-state[k,a] = 0.
Слайд 20
Алгоритм заполнения таблицы next-state
1. Образуем строку Рk а
.
2. Устанавливаем i равным меньшему из значений k+1
(длина Рk а) и m (длина Р).
3. Пока Рi не является суффиксом Рkа, выполняем следующее действие:
А. Устанавливаем i равным i-1.
Найденное значение i и будет номером состояния КА, записываемым в ячейку next-state[k,a].