Форум программистов, компьютерный форум CyberForum.ru

Поиск подстроки - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Переставить байты исходного файла в обратном порядке http://www.cyberforum.ru/cpp-beginners/thread1201120.html
7. По заданному двоичному файлу с произвольным содержанием создать новый двоичный файл, у которого байты переставлены в обратном порядке. Вывести содержимое исходного и итогового файлов на экран.
C++ Изменение значения указателя Здравствуйте В коде приведена функция, которая при помощи указателей считывает размер массива и его элементы из файла блокнота. Почему значение, хранящееся в массиве после выполнения цикла самопроизвольно меняется? функция мэйн #include <iostream> #include <stdlib.h> #include <windows.h> http://www.cyberforum.ru/cpp-beginners/thread1201114.html
C++ Рекурсивная функция, выводящая на экран все целые числа от N до K, N<K
рекурсивная функция, выводящая на экран все целые числа от N до K, N<K
C++ Написать рекурсивную функцию, выводящую на экран все целые числа в определенном интервале
рекурсивная функция, выводящая на экран все целые числа от N до K, N<K
C++ Можно ли обратиться к 3 элементу массива ? http://www.cyberforum.ru/cpp-beginners/thread1201086.html
Если у нас есть int *x, y = { 1,2,3,4,5 }, можно ли обратиться к 3 элементу массива вот так? x=y; *(x+2) Думаю, что нет, так как не взят адрес x=&y А что вобще произойдет при таком условии? x=y
C++ Перед указанным элементом массива вставить новый элемент Дан массив размера N и целое число K (1 ≤ K ≤ N). Перед элемен- том массива с порядковым номером K вставить новый элемент с нулевым значением. подробнее

Показать сообщение отдельно
Sh@dow777
11 / 11 / 3
Регистрация: 10.12.2013
Сообщений: 645
15.06.2014, 04:52  [ТС]     Поиск подстроки
Извините, что поднимаю тему. В общем, я изменил проверку на наличие подстроки в строке. Вот код.
C++
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
 
int i, j, n, m;
 
int search(char a[], char b[]){
    int i, j, n, m;
    n = strlen(a);
    m = strlen(b);
    int *c = (int*)malloc(m*sizeof(int));
 
    c[0] = 0;
    for(i = 1, j = 0; i < m;i++)
    {
        while(j > 0 && b[j] != b[i])
            j = c[j-1];
        if(b[j] == b[i])
            j++;
        c[i] = j;
 
        for(i = 0,j = 0;i < n;i++){
            while(j > 0 && b[j] != a[i])
                j = c[j-1];
            if(b[j] == a[i]);
            j++;
            if(j == m)
            {
                free(c);
                return i-j+1;
            }
        }
        free(c);
        return -1;
    }
}
 
int main()
{
    char *a = new char[1000000];
    char *b = new char[1000000];
 
    scanf("%s", a);
    scanf("%s", b);
 
    if(search(a,b) == i-j+1)
        printf("YES");
    else
        printf("NO");
 
    delete[]a;
    delete[]b;
 
    getch();
 
    return 0;
}
Теперь если подстрока не входит в строку, выводит NO. Но если я ввожу строку astr и подстроку tt, выводит YES. Хотя не должно. Что мне нужно исправить?

Добавлено через 12 часов 17 минут
Теперь я переделал весь код на С++, как сказал grikukan. Вот код.
C++
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
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <vector>
#include <string>
#include <conio.h>
using namespace std;
    
string a;
string b;
string s;
 
vector<int>prefix(string s)
{
    s = b + '#' + a;
 
    int n = (int) s.length();
    vector<int> pi (n);
    for (int i=1; i<n; ++i) {
        int j = pi[i-1];
        while (j > 0 && s[i] != s[j])
            j = pi[j-1];
        if (s[i] == s[j]) 
            ++j;
        pi[i] = j;
    }
    return pi;
}
 
int main()
{
    int k, l;
 
    k = a.length();
    l = b.length();
 
    getline(cin,a);
    getline(cin,b);
 
    for(int i = l;i < l+k+1;i++){
        if(pi[i] == l)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
 
    getch();
 
    return 0;
}
Но теперь в этой строке
C++
1
if(pi[i] == l)
мне подчеркивает pi. Скажите, что я не так делаю или не доделываю?
 
Текущее время: 02:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru