大小寫不計,只看字母跟數字
如果完全沒有符合字母跟數字的也算是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;
}
沒有留言:
張貼留言