給定乙個字串,如何判斷這個字串是否是回文串?
思路一:直接在字串的首尾兩端各放置乙個指標
*front和*back,然後開始遍歷整個字串,當*front不再小於*back時完成遍歷。在此過程中,如果出現二者的值不相等,那麼久表示不是回文串;如果兩個指標指向的字元始終相等就表示該字串是回文字串。
時間複雜度:o(n)
思路二:先使用快慢指標確定出字串的中間位置,然後分別使用兩個指標從開中間位置開始向相反的方向掃瞄,知道遍歷完整個字串。
時間複雜度:o(n)
找中間位置的方法:
1、
快慢指標;
2、一種有效的計算方法
//m定位到字串的中間位置
int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0;
first = str + m;
second= str + n - 1 - m;
兩種思路的**如下:
//思路一
#include using namespace std;
//*s為字串,n為字串的長度
bool ispalindrome(char *str, int n)
while (frontusing namespace std;
//*s為字串,n為字串的長度
bool ispalindrome(char *str, int n)
//m定位到字串的中間位置
int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0;
first = str + m;
second= str + n - 1 - m;
while (first>str)
first--;
second++; }
return true;
}int main( )
{ char str = "abcgba";
int n = strlen(str);
bool sign;
sign = ispalindrome(str, n);
if (sign == true)
{ cout << "此字串是回文字串"<綜上所述,雖然上面兩種方法採用不同的遍歷方式來掃瞄字串,但是最終的時間複雜度都是一樣,效率基本上是一樣的。
判斷回文串,判斷回文數,最長回文串,回文串的個數
判斷乙個字串是否是回文串,首先了解下它的定義 回文串 是乙個正讀和反讀都一樣的字串,比如 level 或者 noon 等等就是回文串。所以判斷是否是回文串,判斷這個字串是否對稱即可。從而用兩個指標同時向中間掃瞄即可判斷。判斷字串是否是回文串,即判斷是否對稱。兩邊指標同時向中間掃瞄,判斷是否相等,不等...
回文數字判斷
題目描述 有這樣一類數字,他們順著看和倒著看是相同的數,例如 121 656 2332 等,這樣的數字就稱為 回文數字。編寫乙個函式,判斷某數字是否是回文數字。要求實現函式 int ispalindrome int inumber 輸入 inumber 整型數字 輸出 0 不是回文數字 1 是回文數...
棧 回文判斷
判斷乙個棧是不是 回文 回文,英文palindrome,指順著讀和反過來讀都一樣。由棧的資料結構可知,棧是乙個先進後出的資料結構,因此為了判斷該棧是否是乙個回文棧,我們可以將棧的一半彈出來,壓入另外乙個棧,然後再進行判斷他們對於資料是否相同即可。當棧的長度為偶數時 我們只需要彈出一半的資料,然後可直...