Mock Exam 4 Problem 3 Title search (Java)

Здравейте,

Дали някой случайно има примерно решение на задачата “Title search” и ако не му е проблем да
го качи , тъй като имам малки проблеми с нея ?
Благодаря предварително :slight_smile:

Помня тази задача. И мен много ме беше измъчила. Ще потърся и ако го намеря, ще ти пратя решението.

1 Like

Намерих го.


import java.util.Scanner;

public class MockExam4_3 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] thePhrase = scanner.nextLine().split("");
        int num = Integer.parseInt(scanner.nextLine());
        String[] allWords = new String[num];
        for (int i = 0; i < num; i++) {
            allWords[i] = scanner.nextLine();
        }
        for (String word : allWords) {
            String[] letters = word.split("");

            int j = 0;
            int count = 0;

            for (int i = 0; i < letters.length; i++) {
                boolean letterFound = false;
                for (; j < thePhrase.length; j++) {
                    if (letters[i].equals(thePhrase[j])) {
                        count++;
                        j++;
                        letterFound = true;
                        break;
                    }
                }
                if (!letterFound) {
                    break;
                }
            }

            if (count < letters.length) {
                System.out.println("No such title found!");
                continue;
            }


            j = 0;
            if (count == letters.length) {
                for (int i = 0; i < letters.length; i++) {
                    for (; j < thePhrase.length; j++) {
                        if (letters[i].equals(thePhrase[j])) {
                            thePhrase[j] = "#";
                            j++;
                            break;
                        }
                    }
                }
            }


            for (int i = 0; i < thePhrase.length; i++) {
                if (thePhrase[i].equals("#")) {
                    continue;
                }
                System.out.print(thePhrase[i]);
            }
            System.out.println();

        }
    }
}

Проучи го разбери как работят вътрешните цикли. Успех!

4 Likes

Извинете ме ако задавам глупав въпрос, но не разбирам условието докрай, а именно последния примерен Output: Input

cfoadset
2
code
slow

Output

fast
No such title found!

Защо въпреки че се съдържа “s” във fast във примерния отговор се дава че не е намерено нищо? Може би аз не разбирам нещо … Също и Constraints

  • 3 <= N <= 10 а има 2 примера, в които N = 2, много благодаря предварително!

И аз това точно , изглежда , бях объркал в задачата.
Търси се цялата последователност от букви ( sequence) ,
а не да маха всяка повтаряща се буква.
И още нещо , което не трябва да се забравя е, че след всеки модифициран ред, работим с вече модифицирания а не с началния…

3 Likes

@npstaykov Много благодаря за отговора!

1 Like

Здравей,

Ако може малко да ме просветиш, защо декларираш на две места променливи извън for loop и добавяш итерация а не в скобите.
например тук
j = 0;
if (count == letters.length) {
for (int i = 0; i < letters.length; i++) {
for (; j < thePhrase.length; j++) {
if (letters[i].equals(thePhrase[j])) {
thePhrase[j] = “#”;

не мога да схвана причината, но отчитам разликата в крайния резултат.

Благодаря

Привет,
целта на извеждането на итератора пред външния цикъл е той да не се занулява. Ползата от това е, че ако сме намерили дадена буква примерно на 4-то място, следващата буква да се търси от 5-то място напред. В противен случай ще ни даде неправилна последователност и грешен резултат.

2 Likes

Много багодаря за разяснението Ивайло,

сега всичко е ясно и си дойде на мястото. :slight_smile:

Здравейте,
Видях примерното решение на задачата, но все пак искам да доразвия моя код, ако е възможно, за да бъде приета изцяло задачата.
Моля за проверка какво изпускам!
Към какво трябва да се насоча - според мен е решена правилно.
import java.util.Scanner;

public class Exercise43 {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
String longWord = s.nextLine();
String temp = longWord;

    int N = Integer.parseInt(s.nextLine());
    String[] words = new String[N];
    for (int i = 0; i < N; i++) {
        words[i] = s.nextLine();
    }

    for (String word : words) {
        for (int i = 0; i < word.length(); i++) {
            temp = temp.replaceFirst(Character.toString(word.charAt(i)), "");
        }

        if (temp.length() == (longWord.length() - word.length())) {
            System.out.println(temp);
            longWord = temp;
        }else{
            temp=longWord;
            System.out.println("No such title found!");
        }
    }
}

}

Здравей, като насока не използвай replaceFirst() защото в тази задача не търсим само отделни букви/символи, а последователност (sequence :slightly_smiling_face:)

Аз вземам една “дума-word”(от арея с думи) и заменям символите с празен символ, ако има еднакви в “израза-longWord” - след това проверявам дали всички символи са махнати(резултат-temp==longWord.length-word.length, ако не са следователно израза си остава същия.
Решението ми работи за първите три случая и за последните два!
За останалите 18 случая - не (там излиза отговор нещо такова: sdhfksjhdkfhlaskdhfkh).
Не разбирам какво трябва да променя - за да работят и останалите случай.

Значи ако първия символ е на 5та позиция - после трябва да започвам от 5та позиция натам?
Не може ако първата буква е на 5та позиция - следващата да е на позиция преди 5 ?
Това ли е проблема?

1 Like

Здравей, да, точно така е, ако първата буква е на 5-та позиция, следващата трябва да започнеш да я търсиш от 5-та позиция нататък. Успех!

Благодаря ти! :slight_smile:

1 Like