Массив вне границ при поиске палиндромов - PullRequest
0 голосов
/ 07 апреля 2020

Я работаю над изучением c# и делаю задачи LeetCode для практики. Сегодня он ищет палиндромы! Этот вопрос состоит из двух частей, поскольку у меня возникла техническая проблема, но мое решение включает в себя несколько вложенных циклов, и уродливость кода заставляет меня думать, что я на неправильном пути.

Во-первых, Я решил составить два списка с возможными палиндромами; четный список и нечетный список.

var userString = "abcbabbba";
// convert to char array

var userCharArr = userString.ToCharArray();

// store these indexes in two separate List<int>. One for AA(i + 1) and ABA(i +- 1)
bool hasPalindrome = false;
var palinEven = new List<int>();
var palinOdd = new List<int>();

        for (int i = 0; i < userCharArr.Length -1; i++)
        {
            if (userCharArr[i] == userCharArr[i + 1])
            {
                palinEven.Add(i);
                hasPalindrome = true;
            }
        }

        for( int i = 1; i < userCharArr.Length -1; i++) { 
                if (userCharArr[i - 1] == userCharArr[i + 1])
                {
                    palinOdd.Add(i);
                    hasPalindrome = true;
                }
        }

//run check on lists to find largest palindrome OR display if no palindrome
if(hasPalindrome == true)
    {
        PalindromeCheck();
        PrintPalindromes();
    }
    else
        Console.WriteLine("There are no palindromes in the given string");

Во-первых, я пытался найти способы избежать исключения OutOfBounds. Так как я проверяю каждый элемент на элемент + 1, я собираюсь попасть в исключение. Я попытался поставить проверку для if (userCharArr [i + 1])! = Null, но Visual Studio говорит мне, что ответ всегда будет верным, потому что он ищет int. Я запутался в этом, потому что я ищу элемент Char. Выше вы можете видеть, что я остановил For l oop в массиве. Длина - 1, а второй l oop начинается с i = 1 вместо обычного нуля. Технически это работает, но в глубине души я знаю, что это неправильный способ взломать это вместе.

Второй вопрос. Как только эти списки заработают, я собираюсь запустить гнездо foreach / while / if для каждого из них. Посмотрите на каждый сохраненный элемент, проверьте, расширяется ли палиндром, затем сравните последний действительный палиндром с текущим наибольшим палиндромом. Когда палиндром становится недействительным, время l oop ломается, и следующий элемент в foreach проверяется. Опять же это похоже на тупое решение. Если у кого-то есть более краткий способ решения этой проблемы, я бы хотел услышать это.

...