Намерете най-дългия общ префикс на два низа

Искам да намеря най-дългия общ префикс на два низа. Има ли начин да завъртя последните си няколко оператора if, така че да мога да завърша на последните знаци, които не съвпадат един с друг?

System.out.println("Enter the first string: ");
String s = input.nextLine();

System.out.println("Enter the second string: ");
String s2 = input.nextLine();

//check if first characters are same
if (s.charAt(0) != s2.charAt(0)) {
  System.out.println(""+s+ " and "+s2+ " have no common prefix");
  System.exit(0);
    }

if (s.charAt(0) == s2.charAt(0))
  System.out.print(" "+s.charAt(0));

if (s.charAt(0) == s2.charAt(0))
  System.out.print(" "+s.charAt(1));

if (s.charAt(0) == s2.charAt(0))
  System.out.print(" "+s.charAt(2));  
  }
}

Пример:

Enter first string: Welcome to c++

Enter second string: Welcome to java

Кодът трябва да върне Добре дошли в като общ префикс.


person afrojuju_    schedule 18.03.2014    source източник
comment
Можете ли да дадете пример какво трябва да прави вашият код, защото не съм напълно сигурен, че разбирам идеята? Доколкото разбирам, ако имате abc1 и abc2 кодът ви трябва да казва, че първите 3 знака съвпадат и ако са abcd1 и abcd2, тогава първите четири и така нататък... това ли е идеята?   -  person Leron_says_get_back_Monica    schedule 19.03.2014
comment
тест: Добре дошли в c++ Добре дошли в java return: Добре дошли в   -  person afrojuju_    schedule 19.03.2014
comment
@Dexters, да, вашият отговор работи за мен. възможно ли е да го редактирам без тези пакети?? и също така можете ли да обясните как работи кодът?   -  person afrojuju_    schedule 19.03.2014
comment
@afrojuju_ Добавих коментари   -  person Dexters    schedule 19.03.2014
comment
Възможен дубликат на Намерете най-дългия общ префикс?   -  person JavaBeast    schedule 05.12.2017


Отговори (2)


Опитайте тази. Предполагам, че това се опитвате да постигнете. Ако това е правилно, ще добавя обяснение по-късно

import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        String s = "Hello Wo";
        String s2 = "Hello World";
        String small,large;
         if(s.length() > s2.length()) 
            {small = s2;large = s;}
          else
            {small = s;large = s2;}
        int index = 0;    
        for(char c: large.toCharArray())
        {
            if(index==small.length()) break;
            if(c != small.charAt(index)) break;
            index++;
        }
        if(index==0)
          System.out.println(""+s+ " and "+s2+ " have no common prefix");
        else
          System.out.println(large.substring(0,index));
    }
}

Редактиране:

  1. Намирам по-големия от низовете и го избирам да бъде външният низ, за ​​да се зацикли
  2. toCharArray() преобразува низа в знаци, така че можете да преминете през всеки знак в низа, като използвате foreach на Java (За повече щракнете върху[1])
  3. Inside the loop you should exit on two conditions
    • End of the string (I use length to find if I reach end of smaller string)
    • няма повече съответстващи знаци между два низа
  4. увеличавате индекса, докато не излезете от едно от горните условия
  5. Докато излезете от for цикъла, index ще съдържа последния индекс, където и двата низа са непрекъснато равни.
  6. Ако индекс = 0. просто кажете, че няма съвпадения, иначе отпечатайте знаци от 0 до index
person Dexters    schedule 18.03.2014
comment
+1 за използване на индекс. Мислех да използвам ArrayList<Character>(), но твоята идея е по-добра. - person Leron_says_get_back_Monica; 19.03.2014
comment
това работи. можете ли да обясните какво прави toCharArray и също така да обясните как работи кодът - person afrojuju_; 19.03.2014
comment
@afrojuju_ добави някои коментари. - person Dexters; 19.03.2014
comment
@Dexters благодаря ти много. току-що ме спаси след 3 часа взиране в моя код - person afrojuju_; 19.03.2014

Може би нещо като:

int sLength = s.length(),
    s2Length = s2.length(),
    minLength = (sLength < s2Length) ? sLength : s2Length;

for (int i = 0; i < minLength; i++) {
    if (s.charAt(i) == s2.charAt(i)) {
        System.out.println(s.charAt(i));
    }
    else {
        break;
    }
}

Но повече подробности относно въпроса ви би било чудесно.

Редактиране: Зависи какво иска да направи @afrojuju_. Това не е ясно. Може да се добави още малко логика, за да се постигне желаното поведение.

Редактиране 2: Добавено сравнение на дължина на низ, както е посочено от @JavaBeast.

person zrac    schedule 18.03.2014
comment
Вероятно бихте искали да break;, когато условието if е неуспешно, тъй като няма да има нужда да продължавате цикъла, след като бъде намерен несъвпадащ знак. - person Paul Richter; 19.03.2014
comment
Редактирах преди да видя този коментар. Има смисъл. Някак си не направих целия код, защото не бях сигурен какво точно означава въпросът (тъй като @afrojuju_ може да търси префикси вътре в низ - нямаше да е префикс в неговия термин, но...) Както и да е редактирано;) - person zrac; 19.03.2014
comment
моля, проверете въпроса ми отново. добавих тестовите въпроси, които исках. Благодаря @zrac - person afrojuju_; 19.03.2014
comment
Отговорът е слаб. Трябва първо да сравните дължината на низа, за да сте сигурни в границите. вижте отговора тук: stackoverflow.com/questions/8033655/find-longest -common-prefix - person JavaBeast; 05.12.2017