2018年1月31日 星期三

[125] Valid Palindrome

判斷是不是回文
大小寫不計,只看字母跟數字
如果完全沒有符合字母跟數字的也算是YES
(為什麼要這樣定義為什麼~~~搖作者肩膀)
題意不難可是一堆corner case
(是說這跟special case 有什麼不一樣嗎XD)
覺得瑣碎 QQ

Valid Palindrome

bool isAlphanumeric(char *pL)
{
    if (pL[0]<48 || (pL[0]>57 && pL[0] <65)  || (pL[0]>90 && pL[0]<97) || (pL[0] >122))
        return false;
    return true;
}

bool isPalindrome(char* s) {
    if(s==NULL)
        return true;
    char *pL=s;
    char *pR = s+strlen(s) -1;

    while(pL<pR)
    {
        if (!isAlphanumeric(pL))
            pL++;
        else if (!isAlphanumeric(pR))
            pR--;
        else if (strncasecmp(pL++,pR--,1)!=0)
            return false;
    }    
    return true;
}
20240525 更新
奇怪我的腦袋是漿糊Orz

bool isPalindrome(char* s) {
int len = strlen(s);
int l=0; int r=len -1;
while (l<r)
{
if (s[l]>=65 && s[l] <=90)
s[l] += 32;
if (!((s[l] >=97 && s[l] <=122) || (s[l] >=48 && s[l] <=57)))
{
l++;
continue;
}
if (s[r]>=65 && s[r] <=90)
s[r] += 32;
if (!((s[r] >=97 && s[r] <=122) || (s[r] >=48 && s[r] <=57)))
{
r--;
continue;
}
if(s[l]!= s[r])
return false;
l++;
r--;
}
return true;
}

20251101更新
奇怪我怎麼看不懂我以前在寫什麼Orz 
這難道就是所謂的進步嗎!!!(倒退三步)
bool isChar(char* c)
{
if (*c >= 65 && *c <= 90)
*c = *c +32 ;
if ((*c >= 97 && *c <= 122) || (*c >= 48 && *c <= 57))
return true;
return false;
}

bool isPalindrome(char* s) {
int len = strlen(s);
int l=0;
int r= len-1;
while (l<=r)
{
while (l<len && !isChar(&s[l]))
l++;
while (r>0 && !isChar(&s[r]))
r--;
if (l<r && s[l]!=s[r])
return false;
l++;
r--;
}

return true;
}

那個... l++跟r--不能放進if 那一行耶~為什麼呢XD
答案是放進去的話前面的小於要改成小於等於!!! 陷阱真多Orz
if (l<=r && s[l++]!=s[r--])
return false;

再自問自答XD 或是上面的while 等號拿掉也可以!重點就是l跟r 的index 要有移動& 有檢查到可以離開迴圈

bool isPalindrome(char* s) {
int len = strlen(s);
int l=0;
int r= len-1;
while (l<r)
{
while (l<len && !isChar(&s[l]))
l++;
while (r>0 && !isChar(&s[r]))
r--;
if (l<r && s[l++]!=s[r--])
return false;
}
return true;
}

沒有留言:

張貼留言