найти, является ли строка подстрокой другой строки в SML NJ - PullRequest
3 голосов
/ 05 декабря 2011

В SML NJ я хочу узнать, является ли строка подстрокой другой строки, и найти ее индекс.Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

Функция Substring.position - единственная, которую я могу найти в базовой библиотеке, которая, кажется, выполняет поиск строк.К сожалению, модуль Substring довольно сложен в использовании, поэтому я написал следующую функцию для его использования.Просто передайте две строки, и он вернет option: NONE, если не найден, или SOME индекса, если он найден:

fun index (str, substr) = let
  val (pref, suff) = Substring.position substr (Substring.full str)
  val (s, i, n) = Substring.base suff
in
  if i = size str then
    NONE
  else
    SOME i
end;
0 голосов
/ 06 декабря 2011

Ну, у вас есть все функции подстроки, однако, если вы хотите также узнать ее положение, тогда проще всего сделать это самостоятельно с линейным сканированием.

По сути, вы хотите разбить обе строки, а затем сравнить первый символ подстроки, которую вы хотите найти, с каждым символом исходной строки, увеличивая счетчик позиции каждый раз, когда вы терпите неудачу. Когда вы находите совпадение, вы переходите к следующему символу в подстроке, не перемещая счетчик позиции. Если подстрока «пустая» (смоделирована, когда вы остались с пустым списком), вы сопоставили ее все и можете вернуть индекс позиции, однако, если сопоставление неожиданно завершилось неудачно, вы должны вернуться назад, когда у вас было первое совпадение и пропустите букву (увеличив счетчик положения) и начните все сначала.

Надеюсь, это поможет вам начать делать это самостоятельно.

...