2012-06-25 5 views
0

Может ли кто-нибудь помочь мне написать функцию, которая проверяет, является ли строка подстрокой другой строки?OCAML - строки и подстроки

(может быть больше, чем только 2 строки)

Благодаря

+2

Что вы имеете в виду под "может быть больше, чем только 2 строкой? Что касается тестов с строкой/подстрокой, см. Http://stackoverflow.com/q/8373460/520394. –

+0

Хотите показать нам свои попытки, чтобы мы могли помочь вам более эффективно? Помогите нам помочь вам. – Tim

ответ

3

С String модуля:

let contains s1 s2 = 
    try 
    let len = String.length s2 in 
    for i = 0 to String.length s1 - len do 
     if String.sub s1 i len = s2 then raise Exit 
    done; 
    false 
    with Exit -> true 

С Str модулем, как @barti_ddu сказал проверить this topic:

let contains s1 s2 = 
    let re = Str.regexp_string s2 in 
    try 
     ignore (Str.search_forward re s1 0); 
     true 
    with Not_found -> false 
+0

Использование памяти для 'String' - это страшно! –

+0

Да, но я думал, что код будет достаточно прост для понимания для нового пользователя OCaml :-) – cago

1

String основанной Альтернативы ответа cago, что может иметь более высокую производительность и более низкое использование памяти:

let is_substring string substring = 
    let ssl = String.length substring and sl = String.length string in 
    if ssl = 0 || ssl > sl then false else 
    let max = sl - ssl and clone = String.create ssl in 
    let rec check pos = 
     pos <= max && (
     String.blit string pos clone 0 ssl ; clone = substring 
     || check (String.index_from string (succ pos) substring.[0]) 
    ) 
    in    
    try check (String.index string substring.[0]) 
    with Not_found -> false 
-6
String str="hello world"; 


System.out.println(str.contains("world"));//true 

System.out.println(str.contains("world1"));//false 
+0

вопрос был о ocaml не java – mou

Смежные вопросы