Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <sstream>
- using namespace std;
- string getSubstring(string &s, int first, int last) //возвращает подстроку от first до last включительно
- {
- if (first <= last)
- {
- string substring = "";
- for (int i = first; i <= last; i++)
- substring += s[i];
- return substring;
- }
- }
- int stringLength(string &s) //возвращает длину строки
- {
- int i = 0;
- while (s[i])
- i++;
- return i;
- }
- bool isSubstring(string &str, string &substr, int substrBeginning)
- {
- for (int i = 0; i < stringLength(substr); i++)
- if (str[substrBeginning + i] != substr[i])
- return false;
- return true;
- }
- bool substringsFirstCondition(string &str, string &substr, int center) //проверяет, входит ли подстрока в строку только равноудаленно от концов
- {
- int substringsCount = 1;
- for (int j = 0; j < stringLength(str) - stringLength(substr) + 1; j++)
- if (center != j)
- if (str[j] == substr[0])
- if (isSubstring(str, substr, j))
- {
- if (j < center)
- {
- if (j != stringLength(str) - center - stringLength(substr))
- return false;
- }
- else
- if (center != stringLength(str) - j - stringLength(substr))
- return false;
- substringsCount++;
- }
- if (substringsCount == 2)
- return true;
- else
- if (stringLength(str) - center - stringLength(substr) == center)
- return true;
- }
- int substringsCount(string &str, string &substr, int center) //возвращает количество вхождений подстроки в строку
- {
- int counter = 1;
- for (int j = 0; j < str.length() - substr.length() + 1; j++)
- if (center != j)
- if (str[j] == substr[0])
- {
- if (isSubstring(str, substr, j))
- counter++;
- if (counter > 2)
- break;
- }
- return counter;
- }
- void processStrings(string &string1, string &string2, string &firstSubString, string &secondSubString, int first)
- {
- for (int j = 0; j < stringLength(string1); j++)
- if (first <= j)
- {
- string check = getSubstring(string1, first, j);
- if (substringsFirstCondition(string1, check, first))
- {
- firstSubString = check;
- for (int k = 0; k < stringLength(string2) - stringLength(firstSubString) + 1; k++)
- {
- check = getSubstring(string2, k, k + stringLength(firstSubString) - 1);
- if (substringsCount(string2, check, k) <= 2)
- {
- secondSubString = check;
- break;
- }
- }
- if (secondSubString[0])
- break;
- }
- }
- }
- void findSubstrings(string &string1, string &string2, string &firstSubString, string &secondSubString)
- {
- for (int i = 0; i < stringLength(string1); i++)
- {
- processStrings(string1, string2, firstSubString, secondSubString, i);
- if (secondSubString[0])
- break;
- }
- }
- string formResult(string &firstSubString, string &secondSubString)
- {
- string result;
- if (secondSubString[0])
- {
- stringstream resultStream;
- for (int i = 0; i < stringLength(firstSubString); i++)
- resultStream << firstSubString[i] << secondSubString[i];
- result = resultStream.str();
- }
- else
- result = "There are no requiered substrings";
- return result;
- }
- int main()
- {
- string string1, string2;
- cout << "Enter the first string: ";
- cin >> string1;
- cout << "Enter the second string: ";
- cin >> string2;
- string firstSubString, secondSubString;
- findSubstrings(string1, string2, firstSubString, secondSubString);
- cout << firstSubString << endl;
- cout << secondSubString << endl;
- string result = formResult(firstSubString, secondSubString);
- cout << result << endl;
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement