Самая длинная дублированная строка

Привет, я должен написать программу, которая ищет самую длинную дублированную подстроку во введенной строке. Ниже приведен метод ввода строки из основной программы. Можете ли вы указать на любые ошибки, пожалуйста, держите это в простых словах, чтобы я понял больше Спасибо.

class metod{
    String Find (String input)
    {
        int a,n;
        int y = 0;
        String dupSub = "";
        int x = input.length();
        System.out.println(x);


        do{
            a = input.indexOf(" ");
            if(a <0){
                System.out.println(input);
            }
            while(!(a == 0)){
                String sub = input.substring(y,a);
                String rest = input.substring(a+1,x);
                n = rest.indexOf(sub);
                if(n==0){
                    Find(rest);
                }
                else{
                    dupSub = sub;
                    input = rest;
                    x = rest.length();
                }
            }

        }while(!(a ==0));

        return dupSub;
    }

2 ответа

Джон, вы можете рассмотреть возможность использования более модульного подхода; Я считаю, что это помогает мне организовать свои мысли.

У вас может быть такой метод:

public String findLongestDuplicatedSubstring(String text) {
    List<String> substrings = findAllSubstrings(text);
    List<String> duplicatedSubstrings = findDuplicated(substrings);
    String longest = findLongest(duplicatedSubstrings);

    return longest;
}

Я понимаю, что это домашнее задание, поэтому я не буду заполнять методы, которые этот вызовет. Однако, как сторонник разработки через тестирование, я бы посоветовал вам рассмотреть возможность использования теста JUnit, чтобы помочь вам подтвердить каждый из этих меньших методов. Этот подход может помочь вам изолировать любые проблемы, которые могут у вас возникнуть. Вот начало некоторых методов испытаний:

@Test
public void testFindLongestDuplicatedSubstring() {
    assertEquals("ab", findLongestDuplicatedSubstring("abcab"));
}

@Test
public void testFindDuplicated() {
    List<String> substrings = new ArrayList<String>();
    substrings.add("a");
    substrings.add("ab");
    substrings.add("abc");
    substrings.add("abca");
    substrings.add("abcab");
    substrings.add("b");
    substrings.add("bc");
    substrings.add("bca");
    substrings.add("bcab");
    substrings.add("c");
    substrings.add("ca");
    substrings.add("cab");
    substrings.add("a");
    substrings.add("ab");
    substrings.add("b");

    assertEquals(3, findDuplicated(substrings).size());
}

@Test
public void testFindAllSubstrings() {
    List<String> substrings = new ArrayList<String>();
    substrings.add("a");
    substrings.add("ab");
    substrings.add("abc");
    substrings.add("abca");
    substrings.add("abcab");
    substrings.add("b");
    substrings.add("bc");
    substrings.add("bca");
    substrings.add("bcab");
    substrings.add("c");
    substrings.add("ca");
    substrings.add("cab");
    substrings.add("a");
    substrings.add("ab");
    substrings.add("b");

    assertEquals(substrings, findAllSubstrings("abcab"));
}

@Test
public void testFindLongest() {
    List<String> strings = new ArrayList<String>();
    strings.add("a");
    strings.add("b");
    strings.add("ab");

    assertEquals("ab", findLongest(strings));
}

Вам нужно два вложенных цикла для создания всех возможных подстрок, с некоторой постоянной работой внутри, чтобы найти решение:

FOR i->0 to end of list
____FOR j->i to end of list
_______create sub string from i to j
_______check whether sub string exists elsewhere w/ String API
_______if so, check whether sub string is current longest
_______if so, remember it
____END FOR
END FOR
Другие вопросы по тегам