Как я могу заменить букву «а» в строке и заменить ее еще двумя буквами «а»? - PullRequest
1 голос
/ 28 марта 2020
import java.util.Scanner;

public class AddAs
{
    public static void main(String[] args)
    {
        Scanner sc1 = new Scanner(System.in);

        System.out.println("Please enter a word:");

        sc1.close();

        String n = ("aaa");

        char s = 'a';

        System.out.println(s2);

        String pp = moreAs(s2, s, n)

        System.out.println(pp);
    }

    public static String moreAs(String p, char s, String n, String s2)
    {
        if (p.length() < 1)
        {
            return p;
        }

        for (int i = 0; i < p.length(); i++)
        {
            if (p.charAt(i) == s)
            {
                p = p.substring(0, 1) + n + p.substring(++i)

                System.out.println(p);

                return moreAs(p, s, n)
            }
        }
    }

    return s2;
}

Я пишу java программу для работы, программа должна заменить любое вхождение буквы «а» еще на два а ». Например, если пользователь вводит« анаграмма », вывод будет« aaanaaagraaam » ». Это должно быть сделано рекурсивно, есть идеи? Я думаю, что я на правильном пути, я не уверен, задавайте любые вопросы. Я знаю, что у меня есть строка с именем n, которая содержит 3 a, но я подумала, что если я удалю одну, мне придется заменить ее на три a.

Ответы [ 3 ]

1 голос
/ 28 марта 2020

Рекурсия вызывает один и тот же метод снова и снова, пока не будет достигнуто условие завершения.

Итак, начните с выбора условия завершения. Мы будем анализировать строку up char по char, пока ничего не останется, поэтому хорошим условием завершения здесь является пустая строка. (Это то, что вы уже правильно сделали.)

Затем мы разбиваем строку, чтобы посмотреть на нее по одному символу за раз, символ head, остаток строки - tail.

В зависимости от содержимого головы мы либо сохраняем символ, либо заменяем на "aaa", но в обоих случаях мы возвращаемся к replaceAwithAAA с хвостом.

Поскольку хвост каждый раз короче , это гарантированно приведет к пустой строке и, таким образом, в какой-то момент будет конечным sh.

  public static String replaceAwithAAA(String s) {
    if (s.length() == 0) return ""; // termination condition

    char   head = s.charAt(0);
    String tail = s.substring(1);

    if (head == 'a') { // hint: this could also be `s.startsWith("a")`
      return "aaa" + replaceAwithAAA(tail); // recursion
    } else {
      return head  + replaceAwithAAA(tail); // recursion
    }
  }

Я уверен, что вы можете настроить moreAs, чтобы больше представлять эту структуру. Наличие for l oop внутри вашего метода является ошибкой, вместо этого зацикливается стек вызовов.

0 голосов
/ 28 марта 2020

Вы можете сделать это, используя OOTB (Out-Of-The-Box) String :: replaceAll или используя вашу собственную рекурсивную функцию следующим образом:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("Enter a string: ");
        String str = sc.nextLine();
        System.out.println("Original string: " + str);
        System.out.println("Updated string: " + str.replaceAll("a", "aaa"));

        // Using recursive function
        System.out.println("Updated string (using recursive function): " + moreAs(str, 0));
    }

    static String moreAs(String str, int n) {
        if (n == str.length()) {
            return str;
        }
        if (str.charAt(n) == 'a') {
            // Call the function recursively after replacing 'a' with 'aaa' in str 
            return moreAs(str.substring(0, n + 1) + "aa" + str.substring(n + 1), n + 3);
        } else {
            // Call the function recursively without changing str
            return moreAs(str, n + 1);
        }
    }
}

Пример прогона:

Enter a string: anagram
Original string: anagram
Updated string: aaanaaagraaam
Updated string (using recursive function): aaanaaagraaam

Лог c в пользовательской рекурсивной функции прост и понятен. Не стесняйтесь комментировать в случае каких-либо сомнений / проблем.

0 голосов
/ 28 марта 2020

Нужно только две строки кода

String s = "anagram";
System.out.println(s.replaceAll("a","aaa"));

Который напечатает

aaanaaagraaam
...