2013-04-29 2 views
-4

Если у меня есть две строки с буквами в них, как мне получить все возможные комбинации символов внутри них?Получение всех возможных комбинаций букв из двух строк

Например, если у меня есть я строка «ABC», а другой «DEF», как я могу получить все комбинации, как:

объявление ае аф

о.-д. быть бф ... и т.д. ,

первая буква комбо всегда будет от первой строки, а вторая буква от второй строки.

Я хочу, чтобы он мог работать с несколькими строками. Это для предсказания текста. Каждая строка будет представлять буквы на клавиатуре мобильного телефона.

public void getCombos(){ 

String s1 = "abc" 
String s2 = "def" 

} 
+2

Я проголосовал за Закрыть. Это всего лишь вопрос «дайте мне некоторый код», без видимых усилий со стороны вопросника. –

+0

@ DuncanJones извините, его часть гораздо большего фрагмента кода, просто не знаю, как подойти к нему. – user1835504

+0

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

ответ

1

Обычно я стараюсь избегать вложенных циклов, хотя я не вижу другого пути в этом случае (ну, не лучший способ).

char[] s1array = s1.toCharArray(); 
char[] s2array = s2.toCharArray(); 
for(char s1char : s1array) { 
    for(char s2char : s2array) { 
     String value = String.valueOf(s1char) + String.valueOf(s2char); 
     System.out.println(value); 
    } 
} 

Редактировать

Для того, чтобы получить одиночные символы тоже:

char[] s1array = s1.toCharArray(); 
char[] s2array = s2.toCharArray(); 
for(char s1char : s1array) { 
    for(char s2char : s2array) { 
     String value = String.valueOf(s1char) + String.valueOf(s2char); 
     System.out.println(value); 
    } 
    System.out.println(String.valueOf(s1char)); 
} 
for(char s2char : s2array) { 
    System.out.println(String.valueOf(s2char)); 
} 

Edit 2

В случае, если вы хотите пойти на всех комбинаций, есть несколько очень приятных ответов на Stackove rflow. Like this one.

+0

если есть повторяющийся символ, это будет неудачно – smttsp

+0

Как вы можете прочитать в сообщении, это представления клавиатур на телефонах. Было бы неплохо сбой в коде, если бы были дубликаты. – Aquillo

+0

@ Вулкан: Вы правы. Отвечали слишком много вопросов PHP сегодня. – Aquillo

0

попробовать вложенным для, в сочетании с методом Строка # toCharArray()

+3

Это довольно скудный ответ. Позаботьтесь об этом немного? –

+0

скудный ответ на вопрос без каких-либо усилий, звучит для меня очень хорошо ... гораздо лучше для сайта, чем для написания кода IMHO – jambriz

0

Учитывая ваше описание, я создал простой квадратичный алгоритм:

public static void combine(String s1, String s2) { 
    for(int i = 0; i < s1.length(); i++) { 
     System.out.println(s1.charAt(i)); 
     for(int j = 0; j < s2.length(); j++) { 
      System.out.println(String.format("%s%s", s1.charAt(i), s2.charAt(j))); 
     } 
    } 
} 

Если вам нужно, чтобы избежать дубликатов, можно вставить символы в набор (см. HashSet), а затем использовать их для генерации строк. Вы также можете отслеживать каждый используемый символ и избегать использования их дважды ...

В любом случае, надеюсь, что мой пример поможет вам начать работу.

+0

'' "+' - это плохая привычка конвертировать объекты/примитивы IMHO. – Aquillo

+0

вы правильно хорошо поймаете. Что касается пустого concat, всегда можно использовать String.format вместо этого (или даже String.valueOf), это был самый быстрый/самый простой способ, с помощью которого я мог просто заставить его работать. – deantoni

+0

Нет проблем, ради короткого ответа. Хотя это способ, которым люди забирают плохие habbits, вот почему я это сделал;) – Aquillo

0

Я подумал об алгоритме, но я не знаю, как его реализовать.

Это будет древовидная структура, которая включает в себя все символы на первом уровне, кроме дубликатов, и вы понизте сверху вниз и распечатаете каждый лист.

Например, мы имеем S1 = «ABC», S2 = «ADE» мы будем иметь что-то вроде следующего дерева: enter image description here

Согласно этому образу, мы будем писать «а», «б», .. , "e" и "aa (только один раз), ca, cb, cd" (две символьные строки), и это спасет нас от дубликатов, и вся строка будет распечатана

Смежные вопросы