回文,英文palindrome,指乙個順著讀和反過來讀都一樣的字串,比如madam、我愛我,這樣的短句在智力性、趣味性和藝術性上都頗有特色,中國歷史上還有很多有趣的回文詩。
那麼,我們的第乙個問題就是:判斷乙個字串是否是回文?
同時從字串頭尾開始向中間掃瞄字串,如果所有字元都一樣,那麼這個字串就是乙個回文。採用這種方法的話,我們只需要維護頭部和尾部兩個掃瞄指標即可。
**如下::
bool ispalindrome(constchar *s, int
n)
const
char* front,*back;
//初始化頭指標和尾指標
front =s;
back = s+ n - 1
;
while (front ++front;
--back;
}return
true
;}
這是乙個直白且效率不錯的實現,時間複雜度:o(n),空間複雜度:o(1)。
上述解法一從兩頭向中間掃瞄,那麼是否還有其它辦法呢?我們可以先從中間開始、然後向兩邊擴充套件檢視字元是否相等。
bool ispalindrome2(constchar *s, int
n)
const
char* first, *second;
//m定位到字串的中間位置
int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0
; first = s +m;
second = s + n - 1 -m;
while (first >=s)
--first;
++second;
}return
true
;}
時間複雜度:o(n),空間複雜度:o(1)。
雖然本解法二的時空複雜度和解法一是一樣的,但很快我們會看到,在某些回文問題裡面,這個方法有著自己的獨到之處,可以方便的解決一類問題。
1、判斷一條單向鍊錶是不是「回文」
分析:對於單鏈表結構,可以用兩個指標從兩端或者中間遍歷並判斷對應字元是否相等。但這裡的關鍵就是如何朝兩個方向遍歷。由於單鏈表是單向的,所以要向兩個方向遍歷的話,可以採取經典的快慢指標的方法,即先位到鍊錶的中間位置,再將鍊錶的後半逆置,最後用兩個指標同時從鍊錶頭部和中間開始同時遍歷並比較即可。
template listnode* reverseall(listnode*root)
listnode
*pri = root, *now = root->next;
while(now !=null)
root->next =null;
return
pri;
}
template bool islistpalindrome(listnode*root)listnode
*fast = root, *slow =root;
while(fast->next && fast->next->next)
slow->next = reverseall(slow->next);
listnode
*temproot =root;
slow = slow->next;
while
(slow)
else
}return
true
;}
2、判斷乙個棧是不是「回文」
分析:對於棧的話,只需要將字串全部壓入棧,然後依次將各字元出棧,這樣得到的就是原字串的逆置串,分別和原字串各個字元比較,就可以判斷了。
也可以在用乙個棧,將元素pop出來放到這個棧裡,**如下:
bool isstackpalindrome(stackstr)if(size % 2
)
while(!str.empty() && !sta.empty())
else
}return str.empty() &&sta.empty();
}
C C 之判斷鍊錶是否是回文鍊錶
判斷鍊錶是否是回文鍊錶主要通過判斷對應位置的元素值是否是相等的第一種解法 將原有鍊錶反轉獲取新的鍊錶,與原有的鍊錶比較,判斷對應元素的值是否相等 include using namespace std struct node typedef struct node plist typedef str...
判斷鍊錶是否回文?
given a singly linked list,determine if it is a palindrome.思路 兩個指標,乙個正常遞推,另乙個遞推速度為第乙個的兩倍 node.next.next 到末,分兩種情況 1.奇數個元素,最後快指標指向最後乙個元素 p2.next null 2....
鍊錶逆序 判斷鍊錶是否回文
1.具有煉表頭的單鏈表 假設需要逆序的單鏈表為 則逆序以後的鍊錶為 過程 1 取p1指向header next p1 stu next p2保留p1 next p2 p1 next 將p1 next置為null,因為單鏈表逆序以後,當前的p1節點為尾節點 p1 next null 2 取p3保留p2...