2012-03-20 7 views
10

У меня есть строка в качестве входных данных, и вам нужно сломать строку в двух подстроках. Если левая подстрока равна правой подстроке, чем какая-то логика.Проверьте, является ли строка палиндром

Как я могу это сделать?

Пример:

public bool getStatus(string myString) 
{ 

} 

Пример: myString = "ankYkna", так что если мы разбить его на две части подстроку было бы: левая часть = "АНК". правая часть = "ank" (после разворота).

+0

Какая у вас настоящая проблема? Просто используйте 'myString.SubString()'. – ken2k

+0

@ ken2k как разбить строку на две равные подстроки. – ankur

+1

Итак, вы просто хотите проверить, является ли строка анаграммой? –

ответ

17
public static bool getStatus(string myString) 
    { 
     string first = myString.Substring(0, myString.Length/2); 
     char[] arr = myString.ToCharArray(); 
     Array.Reverse(arr); 
     string temp = new string(arr); 
     string second = temp.Substring(0, temp.Length/2); 
     return first.Equals(second); 
    } 
+0

Это фактически не будет работать для палиндромов с пунктуацией и асимметричными пробелами. Пример: «Нет« X »в Никсоне». Является палиндром. – Espen

0

Если вам просто нужно определить палиндром, вы можете сделать это с помощью регулярного выражения, как описано here. Возможно, не самый эффективный подход, хотя ...

0

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

Таким образом, вы будете иметь что-то вроде:

if(myString.length % 2 = 0) 
{ 
    //even 
    string a = myString.substring(0, myString.length/2); 
    string b = myString.substring(myString.length/2 + 1, myString.lenght/2); 

    if(a == b) 
      return true; 

    //Rule 1: reverse 
    if(a == b.reverse()) //can't remember if this is a method, if not you'll have to write that too 
      return true; 

и т.д., а также делать все, что вы хотите для нечетных строк

7
int length = myString.Length; 
for (int i = 0; i < length/2; i++) 
{ 
    if (myString[i] != myString[length - i - 1]) 
     return false; 
} 
return true; 
+0

Короткий и лаконичный. Мои комплименты. –

+0

Предельно быстрее было бы сохранить 'length/2' в пределах своей переменной. – krillgar

11

Использование LINQ и, конечно, далеко от оптимального решения

var original = "ankYkna"; 
var reversed = new string(original.Reverse().ToArray()); 
var palindrom = original == reversed; 
+0

Строка по сути является символьным массивом, поэтому вызов '.ToCharArray()' избыточен. – krillgar

+0

@krillgar вы правы, строка реализует IEnumerable , поэтому ToCharArray не нужен.Я не могу сказать, было ли это так в 2012 году. –

+2

Я уверен, что это всегда было так, но люди были настолько явны, когда LINQ впервые вышел. Я просто наткнулся на этот вопрос и хотел указать на кого-то другого, кто наткнулся на ваш твердый ответ. – krillgar

44

Просто для удовольствия:

return myString.SequenceEqual(myString.Reverse()); 
+0

Отсутствует 'using System.Linq;' –

2

C#
Одна строка кода с помощью Linq

public static bool IsPalindrome(string str) 
    { 
     return str.SequenceEqual(str.Reverse()); 
    } 
+0

Вам не нужны обратные ссылки вокруг кода с отступом. Они предназначены для кода inline. – khagler

+0

Это был мой первый код, размещенный в Stackoverflow. Я просто подумал, что они выразились. как обозначение области кода. Спасибо anyways –

2

// Этот C Метод # будет проверять для четных и нечетных Lengh палиндромности строки

public static bool IsPalenDrome(string palendromeString) 
     { 
      bool isPalenDrome = false; 

      try 
      { 
       int halfLength = palendromeString.Length/2; 

       string leftHalfString = palendromeString.Substring(0,halfLength); 

       char[] reversedArray = palendromeString.ToCharArray(); 
       Array.Reverse(reversedArray); 
       string reversedString = new string(reversedArray); 

       string rightHalfStringReversed = reversedString.Substring(0, halfLength); 

       isPalenDrome = leftHalfString == rightHalfStringReversed ? true : false; 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 

      return isPalenDrome; 
     } 
0

В этом Метод C# будет проверять строку палиндрома четной и нечетной длины (рекурсивный подход):

public static bool IsPalindromeResursive(int rightIndex, int leftIndex, char[] inputString) 
{ 
    if (rightIndex == leftIndex || rightIndex < leftIndex) 
     return true; 
    if (inputString[rightIndex] == inputString[leftIndex]) 
     return IsPalindromeResursive(--rightIndex, ++leftIndex, inputString); 
    else 
     return false;    
} 
0
public Boolean IsPalindrome(string value) 
{ 
    var one = value.ToList<char>(); 
    var two = one.Reverse<char>().ToList(); 
    return one.Equals(two); 
} 
0
protected bool CheckIfPalindrome(string text) 
{ 
    if (text != null) 
    { 
     string strToUpper = Text.ToUpper(); 
     char[] toReverse = strToUpper.ToCharArray(); 
     Array.Reverse(toReverse); 
     String strReverse = new String(toReverse); 
     if (strToUpper == toReverse) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
    else 
    { 
     return false; 
    } 
} 

Использование этого sipmlest путь.

+0

не может сравнить строку с char [] – wruckie

1

Этот способ является кратким по внешнему виду & Процессы очень быстро.

Func<string, bool> IsPalindrome = s => s.Reverse().Equals(s); 
+1

Это также неверно, так как оно всегда будет возвращать 'false'. 's.Reverse()' является 'IEnumerable ', который никогда не сравнивает ссылочную величину с исходной 'String' (при условии стандартного определения' Enumerable.Reverse' и 'Object.Equals'). –

2
public static bool IsPalindrome(string value) 
     { 
      int i = 0; 
      int j = value.Length - 1; 
      while (true) 
      { 
       if (i > j) 
       { 
        return true; 
       } 
       char a = value[i]; 
       char b = value[j]; 
       if (char.ToLower(a) != char.ToLower(b)) 
       { 
        return false; 
       } 
       i++; 
       j--; 
      } 
     } 
0
class Program 
{ 
    static void Main(string[] args) 
    { 

     string s, revs = ""; 
     Console.WriteLine(" Enter string"); 
     s = Console.ReadLine(); 
     for (int i = s.Length - 1; i >= 0; i--) //String Reverse 
     { 
      Console.WriteLine(i); 
      revs += s[i].ToString(); 
     } 
     if (revs == s) // Checking whether string is palindrome or not 
     { 
      Console.WriteLine("String is Palindrome"); 
     } 
     else 
     { 
      Console.WriteLine("String is not Palindrome"); 
     } 
     Console.ReadKey(); 
    } 
} 
0
public bool IsPalindroom(string input) 
{ 
    input = input.ToLower(); 
    var loops = input.Length/2; 
    var higherBoundIdx = input.Length - 1; 
    for (var lowerBoundIdx = 0; lowerBoundIdx < loops; lowerBoundIdx++, higherBoundIdx--) 
    { 
     if (input[lowerBoundIdx] != input[higherBoundIdx]) 
     return false; 
    } 
    return true; 
} 
0
public static bool IsPalindrome(string word) 
     { 
      //first reverse the string 
      string reversedString = new string(word.Reverse().ToArray()); 
      return string.Compare(word, reversedString) == 0 ? true : false; 
     } 
0

Поскольку палиндром также включает в себя цифры, слова, фразы, и любые их комбинации, и следует игнорировать знаки препинания и случай, (See Wikipedia Article) Предлагаю этот раствор:

public class Palindrome 
{ 
    static IList<int> Allowed = new List<int> { 
     'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 
     'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 
     'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 
     '1', '2', '3', '4', '5', '6', '7', '8', '9', 
     '0' 
    }; 
    private static int[] GetJustAllowed(string text) 
    { 
     List<int> characters = new List<int>(); 
     foreach (var c in text) 
      characters.Add(c | 0x20); 

     return characters.Where(c => Allowed.Contains(c)).ToArray(); 
    } 
    public static bool IsPalindrome(string text) 
    { 
     if(text == null || text.Length == 1) 
      return true; 

     int[] chars = GetJustAllowed(text); 
     var length = chars.Length; 

     while (length > 0) 
      if (chars[chars.Length - length] != chars[--length]) 
       return false; 

     return true; 
    } 
    public static bool IsPalindrome(int number) 
    { 
     return IsPalindrome(number.ToString()); 
    } 
    public static bool IsPalindrome(double number) 
    { 
     return IsPalindrome(number.ToString()); 
    } 
    public static bool IsPalindrome(decimal number) 
    { 
     return IsPalindrome(number.ToString()); 
    } 

} 
+0

Разрешенный список, безусловно, должен быть расширен, чтобы включить больше языков и понятий, чем просто английский, но я надеюсь проиллюстрировать, что просто проверка того, является ли string.reverse() == string не полным решением проблемы палиндрома. – Espen

1

Строка метод расширения, прост в использовании:

public static bool IsPalindrome(this string str) 
    { 
     str = new Regex("[^a-zA-Z]").Replace(str, "").ToLower(); 
     return !str.Where((t, i) => t != str[str.Length - i - 1]).Any(); 
    } 
0

Вот абсолютно простой способ сделать это,

  1. Получить слово как вход в метод.
  2. Назначьте временную переменную исходному значению.
  3. Прокрутите исходное слово и добавьте последний символ к развороту, который вы строите, пока в исходном слове не будет больше символов.
  4. Теперь используйте запас, который вы создали, чтобы сохранить исходное значение для сравнения с построенной копией.

Это хороший способ, так как вам не нужно бросать ints и парные. U может просто передать их методу в их строчном представлении с помощью метода ToString().

public static bool IsPalindrome(string word) 
    { 
     string spare = word; 
     string reversal = null; 
     while (word.Length > 0) 
     { 
      reversal = string.Concat(reversal, word.LastOrDefault()); 
      word = word.Remove(word.Length - 1); 
     } 
     return spare.Equals(reversal); 
    } 

Так что с вашего основного метода, Для четных и нечетных строк длины у просто передать всю строку в метод.

0

Из всех решений, ниже также может быть судим:

public static bool IsPalindrome(string s) 
{ 
    return s == new string(s.Reverse().ToArray()); 
} 
0
static void Main(string[] args) 
{ 
    string str, rev=""; 

    Console.Write("Enter string"); 

    str = Console.ReadLine(); 

    for (int i = str.Length - 1; i >= 0; i--) 
    { 
     rev = rev + str[i]; 
    } 

    if (rev == str) 
     Console.Write("Entered string is pallindrome"); 
    else 
     Console.Write("Entered string is not pallindrome"); 

    Console.ReadKey(); 
} 
1
private void CheckIfPalindrome(string str) 
     { 
      //place string in array of chars 
      char[] array = str.ToCharArray(); 
      int length = array.Length -1 ; 
      Boolean palindrome =true; 
      for (int i = 0; i <= length; i++)//go through the array 
      { 
       if (array[i] != array[length])//compare if the char in the same positions are the same eg "tattarrattat" will compare array[0]=t with array[11] =t if are not the same stop the for loop 
       { 
        MessageBox.Show("not"); 
        palindrome = false; 
        break; 

       } 
       else //if they are the same make length smaller by one and do the same 
       {     
        length--; 
       } 

      } 
      if (palindrome) MessageBox.Show("Palindrome"); 

     } 
+1

Просьба пояснить ответ. – Winter

+0

Код только ответы arent рекомендуется, поскольку они не предоставляют много информации для будущих читателей. – WhatsThePoint

+0

У меня есть объяснение в области комментариев, что еще я должен объяснить? – pilot13

0
string test = "Malayalam"; 
      char[] palindrome = test.ToCharArray(); 
      char[] reversestring = new char[palindrome.Count()]; 
      for (int i = palindrome.Count() - 1; i >= 0; i--) 
      { 
       reversestring[palindrome.Count() - 1 - i] = palindrome[i]; 

      } 

      string materializedString = new string(reversestring); 

      if (materializedString.ToLower() == test.ToLower()) 
      { 
       Console.Write("Palindrome!"); 
      } 
      else 
      { 
       Console.Write("Not a Palindrome!"); 
      } 

      Console.Read(); 
0
public static bool palindrome(string t) 
    { 
     int i = t.Length; 
     for (int j = 0; j < i/2; j++) 
     { 
      if (t[j] == t[i - j-1]) 
      { 
       continue; 
      } 
      else 
      { 
       return false; 
       break; 
      } 
     } 
     return true; 
    } 
+0

Пожалуйста, в следующий раз вместе с кодом введите краткое объяснение. – Kerberos

0

использовать этот путь от dotnetperls

using System; 

    class Program 
    { 
     /// <summary> 
     /// Determines whether the string is a palindrome. 
     /// </summary> 
     public static bool IsPalindrome(string value) 
     { 
      int min = 0; 
      int max = value.Length - 1; 
      while (true) 
      { 
       if (min > max) 
       { 
        return true; 
       } 
       char a = value[min]; 
       char b = value[max]; 

       // Scan forward for a while invalid. 
       while (!char.IsLetterOrDigit(a)) 
       { 
        min++; 
        if (min > max) 
        { 
         return true; 
        } 
        a = value[min]; 
       } 

       // Scan backward for b while invalid. 
       while (!char.IsLetterOrDigit(b)) 
       { 
        max--; 
        if (min > max) 
        { 
         return true; 
        } 
        b = value[max]; 
       } 

       if (char.ToLower(a) != char.ToLower(b)) 
       { 
        return false; 
       } 
       min++; 
       max--; 
      } 
     } 

     static void Main() 
     { 
      string[] array = 
      { 
       "A man, a plan, a canal: Panama.", 
       "A Toyota. Race fast, safe car. A Toyota.", 
       "Cigar? Toss it in a can. It is so tragic.", 
       "Dammit, I'm mad!", 
       "Delia saw I was ailed.", 
       "Desserts, I stressed!", 
       "Draw, O coward!", 
       "Lepers repel.", 
       "Live not on evil.", 
       "Lonely Tylenol.", 
       "Murder for a jar of red rum.", 
       "Never odd or even.", 
       "No lemon, no melon.", 
       "Senile felines.", 
       "So many dynamos!", 
       "Step on no pets.", 
       "Was it a car or a cat I saw?", 

       "Dot Net Perls is not a palindrome.", 
       "Why are you reading this?", 
       "This article is not useful.", 
       "...", 
       "...Test" 
      }; 

      foreach (string value in array) 
      { 
       Console.WriteLine("{0} = {1}", value, IsPalindrome(value)); 
      } 
     } 
    } 
+0

Пожалуйста, добавьте описание к вашему коду, объясняя, что он делает –

+0

см. Комментарий в верхней части функции IsPalindrome :) – FAREH

-1
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 


class palindrome 
{ 
    static void Main(string[] args) 
    { 
     Console.Write("Enter a number:"); 
     string panstring = Console.ReadLine(); 
     Palindrome(panstring); 
     Console.ReadKey(); 
    } 
    static int index = 0; 
    public static void Palindrome(string strexcluding) 
    { 
     try 
     { 
      string reversecounter = string.Empty; 

      for (int i = strexcluding.Length - 1; i >= 0; i--) 
      { 
       if (strexcluding[i].ToString() != null) 
        reversecounter += strexcluding[i].ToString(); 
      } 
      if (reversecounter == strexcluding) 
      { 
       Console.WriteLine("Palindrome Number: " + strexcluding); 
      } 
      else 
      { 
       Sum(strexcluding); 
      } 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 

    public static void Sum(string stringnumber) 
    { 
     try 
     { 
      index++; 
      string number1 = stringnumber; 
      string number2 = stringnumber; 
      string[] array = new string[number1.Length]; 
      string obtained = string.Empty; 
      string sreverse = null; 

      Console.WriteLine(index + ".step : " + number1 + "+" + number2); 

      for (int i = 0; i < number1.Length; i++) 
      { 
       int temp1 = Convert.ToInt32(number1[number1.Length - i - 1].ToString()); 
       int temp2 = Convert.ToInt32(number2[number2.Length - i - 1].ToString()); 

       if (temp1 + temp2 >= 10) 
       { 
        if (number1.Length - 1 == number1.Length - 1 - i) 
        { 
         array[i] = ((temp1 + temp2) - 10).ToString(); 
         obtained = "one"; 
        } 
        else if (number1.Length - 1 == i) 
        { 
         if (obtained == "one") 
         { 
          array[i] = (temp1 + temp2 + 1).ToString(); 
         } 
         else 
         { 
          array[i] = (temp1 + temp2).ToString(); 
         } 
        } 
        else 
        { 
         if (obtained == "one") 
         { 
          array[i] = ((temp1 + temp2 + 1) - 10).ToString(); 
         } 
         else 
         { 
          array[i] = ((temp1 + temp2) - 10).ToString(); 
          obtained = "one"; 
         } 

        } 
       } 

       else 
       { 
        if (obtained == "one") 
         array[i] = (temp1 + temp2 + 1).ToString(); 
        else 
         array[i] = (temp1 + temp2).ToString(); 
        obtained = "Zero"; 
       } 

      } 

      for (int i = array.Length - 1; i >= 0; i--) 
      { 
       if (array[i] != null) 
        sreverse += array[i].ToString(); 
      } 

      Palindrome(sreverse); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine(ex.ToString()); 
     } 
    } 
} 
Смежные вопросы