Объединить две строки с общими начальными и конечными подстроками - PullRequest
1 голос
/ 03 марта 2012

У меня есть две строки, конечная подстрока первой является начальной подстрокой второй, например

string left : ONESTRING
string right : STRINGTWO

Я должен объединить их так, чтобы полученная строка была

result string : ONESTRINGTWO

Длина общей подстроки заранее неизвестна.Если начальная и конечная строки не являются общими, мне нужно вернуть конкатенацию строк.

Это то, чем я сейчас занимаюсь.

for(int i = 1;i< left.length();i++) {
        //substring of length "i" from last of left string
        string temp = left.substr(left.length() -1 -i,i);
        if(temp.length() < right.length()) {
            //check if the right string starts with the above substring 
            if (strncmp(right.c_str(), temp.c_str(), strlen(temp.c_str())) == 0 ) {
                // common substring found, save this result 
                found =  true;
                result = left.substr(0,left.length()-i-1) + right;
            }

        }
    }

if(found == true) {
    return result;
} else {
    return left + right;
}

Буду благодарен за любые указателив более простую реализацию (на любом языке).

Ответы [ 3 ]

1 голос
/ 03 марта 2012

Попробуйте ниже ... Протестировано и работает в JAVA ...

public class FindString {
    public static void main(String[] args) {
    String myString01 = "OneString";
    String myString02 = "StringTwo";

    String commonString = "";
    for (int i = 0; i < myString01.length(); i++) {
        if (myString02.indexOf(myString01.substring(i)) >= 0) {
        commonString = myString01.substring(i);
        break;
        }
    }

    System.out.println("common is " + commonString);

    String firstPart = myString01.substring(0, myString01.indexOf(commonString));
    String secondPart = myString02.substring(myString02.indexOf(commonString) + commonString.length());
    String finalString = firstPart + commonString + secondPart;

    System.out.println("Final String of " + myString01 + " & " + myString02 + " is " + finalString);
    }
}

Примечание

Если вы хотите сделать их строчными, а затем сравнить, используйте .toLowerCase().

Обновление 1

Вывод, который у меня есть,

common is String
Final String of OneString & StringTwo is OneStringTwo

И я верю, что это то, что вы хотите ...

Обновление 2

Некоторые продвинутые выше приведены ниже.

public class FindString {
    public static void main(String[] args) {
    String myString01 = "StringOne";
    String myString02 = "TwoString";

//        String myString01 = "StringOne";
//        String myString02 = "StringTwo";


//        String myString01 = "OneString";
//        String myString02 = "TwoString";

//        String myString01 = "OneString";
//        String myString02 = "StringTwo";

    System.out.println("First String is  = " + myString01);
    System.out.println("Second String is = " + myString02);

    String commonString = "";
    for (int i = 0; i < myString01.length(); i++) {
        if (myString02.indexOf(myString01.substring(i)) >= 0) {
        commonString = myString01.substring(i);
        break;
        }
    }

    if (commonString.isEmpty()) {
        for (int i = 0; i < myString02.length(); i++) {
        if (myString01.indexOf(myString02.substring(i)) >= 0) {
            commonString = myString02.substring(i);
            break;
        }
        }

    }

    String firstPart;

    if (myString01.indexOf(commonString) > 0) {
        firstPart = myString01.substring(0, myString01.indexOf(commonString));
    } else {
        firstPart = myString01.substring(myString01.indexOf(commonString) + commonString.length());
    }

    String secondPart;

    if (myString02.indexOf(commonString) > 0) {
        secondPart = myString02.substring(0, myString02.indexOf(commonString));
    } else {
        secondPart = myString02.substring(myString02.indexOf(commonString) + commonString.length());
    }

    System.out.println("First Part  = " + firstPart);
    System.out.println("Second Part = " + secondPart);
    System.out.println("Common Part = " + commonString);

    String finalString = firstPart + commonString + secondPart;

    System.out.println("Final String of " + myString01 + " & " + myString02 + " is " + finalString);
    }
}
1 голос
/ 03 марта 2012

Используя интеллектуальную арифметику указателей, вы можете пропустить вызовы substr (которые выполняют распределение) и strlen (которые занимают O ( n ) времени в длине строки).

std::string concat(std::string const &left, std::string const &right)
{
    size_t n = left.length();
    for (size_t i=0; i<n; i++)
        if (std::strncmp(left.c_str() + i, right.c_str(), n - i) == 0)
            return left + (right.c_str() + n - i);

    return left + right;
}
0 голосов
/ 03 марта 2012

Попробуйте, у меня все работает

public Void FindString (string left ,string right)
{
int i=0;
string result = string.Empty;

for( i = right.Length ; i>=0;i--)
{
   if(left.Contains(right.Substring(0,i)))
   {
     break;
   }
}

if(i<right.Length)
{
    result =right.Substring(0,i);
}
return  left.Replace(result,"") + result +right.Replace(result,""); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...