создать функцию, которая возвращает строки массива, переставленные в виде палиндрома

Я пытаюсь написать функцию, которая принимает в качестве входных данных массив строк только с строчными буквами. Функция возвращает массив одинаковых строк, но в каждой строке буквы переставлены так, что она становится палиндромом, если это возможно, а если нет, то возвращает -1.

public static Object buildPalin(String[] arrayOfStrings) 
{
    String[] palindrome = new String[arrayOfStrings.length];
    int offset = 0; 

    int charWithoutReflection = 0; 
    List<String> whole= Arrays.asList(arrayOfStrings);
    String wholeString = String.join("", whole);

    for(int i=0; i< arrayOfStrings.length; i++) 
    { 
        if (arrayOfStrings[i] != "") 
        { 
            int currentCharPosition = wholeString.indexOf(arrayOfStrings[i], 
            i + 1); 

            if (currentCharPosition != -1)
            { 
                palindrome[offset] = arrayOfStrings[i]; 
                palindrome[palindrome.length - 1 - offset] = 
                arrayOfStrings[i]; 
                arrayOfStrings[currentCharPosition] = ""; 
                arrayOfStrings[i] = ""; 
            }
            else {
                if (charWithoutReflection > 0) 
                    return -1; 
                palindrome[palindrome.length/2] = arrayOfStrings[i]; 
                charWithoutReflection++; 
            }
            offset++; 
        }
    } 
    return palindrome;
   } 

Эта функция отлично работает в случае, когда входной массив выглядит следующим образом: {"a", "b", "a"} {"a", "b", "c"} и так далее.

но когда у меня есть ввод, как показано ниже: {"aba", "bb", "cac"} и, как это, это массив строк, он терпит неудачу.

Любое руководство или предложение по этому поводу полезно.

ПРИМЕЧАНИЕ. Это не классное задание, а вопрос, который мне задали на собеседовании. Мне удалось придумать вышеуказанное решение, но теперь я пытаюсь заставить его работать и для углового случая. Это будет полезно для будущих интервью.

==============================Обновленный код согласно комментарию Эрика ниже=========

public static Object build(String[] arrayOfStrings) {
   String[] palindrome = new String[arrayOfStrings.length];
   int offset = 0; 
   int charWithoutReflection = 0; 
   List<String> whole= Arrays.asList(arrayOfStrings);
   String wholeString = String.join("", whole);

   for(int i=0; i< arrayOfStrings.length; i++) 
   { 
      if (arrayOfStrings[i] != "") { 
        int currentCharPosition = wholeString.indexOf(arrayOfStrings[i], i + 
        1); 

        if (currentCharPosition != -1)
        { 
          palindrome[offset] = arrayOfStrings[i]; 
          palindrome[palindrome.length - 1 - offset] = arrayOfStrings[i]; 
          arrayOfStrings[currentCharPosition] = ""; 
          arrayOfStrings[i] = ""; 
        }
        else {
          if (charWithoutReflection > 0) 
          {
             System.out.println("failed case");
             return -1;
          }
          palindrome[palindrome.length/2] = arrayOfStrings[i]; 
          charWithoutReflection++; 
        }
        offset++; 
        }
    } 
    return palindrome;
  }

  // code from main function calling above function is:
  public static void main(String[] args) {
    String a[] = {"abb"};
    for ( int j = 0; j < a.length ; j++)
    {
      String[] tokens = a[j].split("");

      System.out.println(Arrays.deepToString((Object[]) build(tokens)));    

    }

Выдает неверный вывод как: (для ввода [a,b,b]

[null, b, null] вместо [b, a, b]


person user1188611    schedule 13.09.2015    source источник
comment
Ваш код не может работать для {"a", "b", "a"} {"a","b","c"}. Это двумерный массив String. Ваш метод принимает только одномерный массив.   -  person Erick G. Hagstrom    schedule 13.09.2015
comment
Или это два разных примера входных массивов, которые работают? Это имело бы смысл.   -  person Erick G. Hagstrom    schedule 13.09.2015
comment
@ErickG.Hagstrom: да, два разных примера массивов (не двумерный массив). оба являются разными входами. Просто хотел показать случаи, когда он работал нормально, а для какого случая код не работает.   -  person user1188611    schedule 13.09.2015
comment
Какова цель переменной wholeString? Если вы просто пытаетесь переставить буквы каждого ввода String, вам никогда не нужно видеть все эти Strings как одно большое String.   -  person Erick G. Hagstrom    schedule 13.09.2015


Ответы (2)


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

 First Case:
    1) Check that all chars have even count but one.
    2) Create a stringBuffer and append the odd char and decrement its count
    3) For each of the remaining characters form your palindrome by adding a char at the front and a char at the end of the string buffer.

 Second Case:
    1) Check that all chars have even counts.
    2) Create a string buffer
    3) For each of the remaining characters from your palindrome as case one.
person Amr    schedule 13.09.2015

Для каждого String превратите его в отсортированный List или массив символов. Затем пройдитесь по списку символ за символом, подсчитывая количество вхождений каждого символа. Если число (n) нечетное, вставьте n вхождений вашего символа в середину вывода String. Если n четно, поставьте n/2 в начале вывода String и n/2 в конце. Если вы встретите более двух символов с нечетным числом вхождений, вы должны вернуть -1. Когда вы дойдете до конца списка, поместите вывод String в выходной массив. И если вы пройдете весь путь, верните этот массив.

public static Object build(String[] arrayOfStrings) {
    String[] palindrome = new String[arrayOfStrings.length];

    for (int i = 0; i < arrayOfStrings.length; i++) {
    String currentString = arrayOfStrings[i];
    if (currentString.isEmpty()) {
        palindrome[i] = currentString;
    } else {
        char[] chars = Arrays.copyOf(currentString.toCharArray(),
            currentString.length() + 1);
        chars[currentString.length()] = Character.MAX_VALUE;
        Arrays.parallelSort(chars);

        char currentChar = chars[0];
        int count = 1;
        boolean foundOdd = false;
        String newString = "";
        for (int j = 1; j < chars.length; j++) {
            if (chars[j] == currentChar) {
                count++;
            } else {
                if (foundOdd) {
                    if (count % 2 == 0) {
                        newString = even(newString, currentChar, count);
                    } else {
                        return -1;
                    }
                } else {
                    if (count % 2 == 0) {
                        newString = even(newString, currentChar, count);
                    } else {
                        foundOdd = true;
                        newString = odd(newString, currentChar, count);
                    }
                }
                count = 1;
                currentChar = chars[j];
            }
        }
        palindrome[i] = newString;
        newString = "";
        }
    }
    return palindrome;
}

private static String even(String oldString, char currentChar, int count) {
    assert count % 2 == 0;
    int halfCount = count / 2;
    String occurrences = "";
    for (int i = 0; i < halfCount; i++) {
        occurrences += currentChar;
    }
    return occurrences + oldString + occurrences;
}

private static String odd(String oldString, char currentChar, int count) {
    assert count % 2 == 1;
    int length = oldString.length() / 2;
    String occurrences = "";
    for (int i = 0; i < count; i++) {
        occurrences += currentChar;
    }
    return oldString.substring(0, length) + occurrences
        + oldString.substring(length);
}

// code from main function calling above function is:
public static void main(String[] args) {
    String a[] = { "abb", "aaaabbcccddddeeffgghhii" };
    Object result = build(a);
    if (result.equals(-1)) {
        System.out.println("Failed to find a palindrome for at least one of the input values");
    } else {
        String[] resultStr = (String[]) result;
        for (int i = 0; i < resultStr.length; i++) {
            System.out.println(resultStr[i]);
        }
    }
}

Код выше ужасен. С одной стороны, он сильно опирается на String конкатенацию. Но это работает.

person Erick G. Hagstrom    schedule 13.09.2015
comment
Я попытался внести изменения в соответствии с вашим предложением, но это не удается в случае, когда abb выводит результат как ===› [ null, b , null ]. Обновленный вопрос с последним кодом. - person user1188611; 13.09.2015