Создайте процедуру, которая для произвольной входной символьной строки, состоящей из произвольного набора слов, выбирает последовательности с наибольшим количеством слов, повторяемых как минимум дважды.
Например, для входной строки:
Мама быстро помыла раму Я вымыла пол Мама быстро помыла раму Я вымыла пол
Результат: мама быстро помыла раму
Извините, я забыла указать, что Есть два пробела между фразами. Я пытался переделать мою похожую программу. Где функция должна удалить повторяющиеся слова (есть перечисления, разделенные запятыми).
Decare
v_str_print VARCHAR2 (100); - output string (sorted)
PROCEDURE myproc1 (p_str_in IN VARCHAR2, p_str_out OUT VARCHAR2) IS
v_comma_count NUMBER; - number of commas
v_str_temp_left VARCHAR2 (100);
v_str_temp_right VARCHAR2 (100);
v_str_final VARCHAR2 (100);
v_str_input VARCHAR2 (100);
BEGIN
v_comma_count: = REGEXP_COUNT (p_str_in, ',');
v_str_input: = p_str_in;
FOR i IN 1..v_comma_count LOOP
WHILE regexp_like (v_str_input, '^,') OR regexp_like (v_str_input, '^ [[: space:]]')
Loop
v_str_input: = TRIM (v_str_input);
v_str_input: = LTRIM (v_str_input, ',');
END LOOP;
- get the first word
v_str_temp_left: = REGEXP_REPLACE (REGEXP_SUBSTR (v_str_input, '^ [A-Z] {1,},', 1), ','); - remove the comma
- form the output line
v_str_final: = v_str_final || v_str_temp_left || ',';
- we remove the first word from the string
v_str_temp_right: = REGEXP_REPLACE (v_str_input, '^ [A-Z] {1,},');
- look for the first word in the line and, if found, replace with a space
v_str_temp_right: = REGEXP_REPLACE (v_str_temp_right, v_str_temp_left || ',', ',');
- overwrite the resulting string (without the first word) with the result of the comparison
v_str_input: = v_str_temp_right;
END LOOP;
v_str_final: = RTRIM (v_str_final, ',');
p_str_out: = v_str_final;
END myproc1;
BEGIN
myproc1 (',,, AA, AB, AA, AA, AA, ABC, ABC ,,,, ABC, ABC, ABC, AC, ABC, AB', v_str_print);
dbms_output.put_line (v_str_print);
END