Created
August 22, 2016 20:56
-
-
Save jianminchen/2e82c22b4b480a4b5eb06f9507956a60 to your computer and use it in GitHub Desktop.
Leetcode 125 - valid palindrome - study code - https://github.com/jianminchen/leetcode-cpp/blob/master/src/ValidPalindrome.cpp, use continue keyword
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Text; | |
using System.Threading.Tasks; | |
namespace Leetcode125_IsPalindrome | |
{ | |
class Program | |
{ | |
/* | |
* Leetcode 125: is palindrome | |
* | |
* blog to read: | |
* http://blog.csdn.net/nomasp/article/details/50623165 | |
*/ | |
static void Main(string[] args) | |
{ | |
bool test = isPalindrome("Aa"); | |
bool test2 = isPalindrome("Ab%Ba"); | |
bool test3 = isPalindrome("B%1*1b"); | |
} | |
/* | |
* Function design: | |
* | |
* study the code: | |
* https://github.com/jianminchen/leetcode-cpp/blob/master/src/ValidPalindrome.cpp | |
* | |
* Time complexity: | |
* O(N) | |
* | |
* use continue keyword to make the code more clear, based on practice #9 | |
* | |
*/ | |
public static bool isPalindrome(string s) | |
{ | |
if (s == null || s.Length == 0) | |
return true; | |
int left = 0; | |
int right = s.Length - 1; | |
// Enforce the rule that one iteration in while loop only work on one of if case, therefore, | |
// more easy to follow. | |
// continue - line 60, line 66 | |
// - also - remove 4th if | |
while (left < right) | |
{ | |
char c1 = s[left]; | |
char c2 = s[right]; | |
bool[] arr = new bool[2] { isAlnum(c1), isAlnum(c2) }; | |
bool isComparable = arr[0] && arr[1]; | |
bool isSame = toUpper(c1) == toUpper(c2); | |
if (!isComparable && !arr[0]) | |
{ | |
left++; | |
continue; | |
} | |
if (!isComparable && !arr[1]) | |
{ | |
right--; | |
continue; | |
} | |
if (isComparable && !isSame) | |
return false; | |
//if (isComparable && isSame) | |
//{ | |
left++; | |
right--; | |
//} | |
} | |
return true; | |
} | |
/* | |
* a-z | |
* A-Z | |
* 0-9 | |
*/ | |
private static bool isAlnum(char c) | |
{ | |
const int SIZE = 26; | |
int[] arr = new int[] { c - 'a', c - 'A', c - '0' }; | |
// is A-Z or a-z or 0 -9 | |
if ((arr[0] >= 0 && arr[0] < SIZE) || | |
(arr[1] >= 0 && arr[1] < SIZE) || | |
(arr[2] >= 0 && arr[2] <= 9)) | |
return true; | |
return false; | |
} | |
/* | |
* | |
*/ | |
private static char toUpper(char c) | |
{ | |
int no = c - 'a'; | |
if (no >= 0 && no < 26) | |
return (char)('A' + no); | |
else | |
return c; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment