1. 程式人生 > >迴文判斷(C/C++)

迴文判斷(C/C++)

給定一個字串,如何判斷這個字串是否是迴文串?

思路一:直接在字串的首尾兩端各放置一個指標*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 <iostream>

using namespace std;

//*s為字串,n為字串的長度
bool IsPalindrome(char *str, int n)
{
	//指向字串首尾的指標
	char *front = str;
	char *back = str + n - 1;

	if(str==NULL||n<1)
	{
		return false;
	}
	while (front<back)
	{
		if (*front != *back)
		{
			return false;
		}
		front++;
		back--;
	}
	
	return true;	
}

int main( )
{
	char str[] = "abba";
	int n = strlen(str);
	bool sign;
	sign = IsPalindrome(str, n);
	if (sign == true)
	{
		cout << "此字串是迴文字串"<<endl;
	}
	else
	{
		cout << "此字串不是迴文字串" << endl;
	}

	return 0;
}
	
//思路二
#include <iostream>

using namespace std;

//*s為字串,n為字串的長度
bool IsPalindrome(char *str, int n)
{
	//指向字串首尾的指標
	char *first;
	char *second;

	if (str == NULL || n<1)
	{
		return false;
	}
	//m定位到字串的中間位置
	int m = ((n >> 1) - 1) >= 0 ? (n >> 1) - 1 : 0;
	first = str + m;
	second= str + n - 1 - m;
	while (first>str)
	{
		if (*first!= *second)
		{
			return false;
		}
		first--;
		second++;
	}
	
	return true;	
}

int main( )
{
	char str[] = "abcgba";
	int n = strlen(str);
	bool sign;
	sign = IsPalindrome(str, n);
	if (sign == true)
	{
		cout << "此字串是迴文字串"<<endl;
	}
	else
	{
		cout << "此字串不是迴文字串" << endl;
	}

	return 0;
}
	


綜上所述,雖然上面兩種方法採用不同的遍歷方式來掃描字串,但是最終的時間複雜度都是一樣,效率基本上是一樣的。


相關推薦

2-8 判斷 20 分

迴文是指正讀反讀均相同的字元序列,如“abba”和“abdba”均是迴文,但“good”不是迴文。編寫一個程式,使用棧判定給定的字元序列是否為迴文。 輸入格式: 輸入待判斷的字元序列,按回車鍵結束,字元序列長度<20。 輸出格式: 若字元序列是迴文,輸出“YES”;否則

判斷字串 20 分c語言解答指標法

判斷迴文字串 (20 分) 本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。 函式介面定義: bool palindrome( char *s ); 函式palindrome判斷輸入字串cha

判斷C/C++

給定一個字串,如何判斷這個字串是否是迴文串? 思路一:直接在字串的首尾兩端各放置一個指標*front和*back,然後開始遍歷整個字串,當*front不再小於*back時完成遍歷。在此過程中,如果出現

C語言實現判斷利用指標的方法

//判斷迴文(指標實現) #include <stdio.h>   #include <stdlib.h>   #include <string.h>       void IsSymmetrical(char *str)   {  

判斷一個數是不是Java StringBuffer

這個題目如果是用Java寫,會聯想到StringBuffer類中有一個倒置字串的函式:reverse(),值得注意的是,這個函式返回一個引用,也就是說,進行倒置之後原來的StringBuffer物件也就變了,所以一定要記得在寫的時候注意。

6-3 判斷字串20 分

本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。函式介面定義:bool palindrome( char *s ); 函式palindrome判斷輸入字串char *s是否為迴文。若是則返回true,否則返回false。裁

習題8-8 判斷字串20 分

題目來源:https://pintia.cn/problem-sets/12/problems/342 本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。 函式介面定義: bool

6-2 判斷字串20 分

6-2 判斷迴文字串(20 分) 本題要求編寫函式,判斷給定的一串字元是否為“迴文”。所謂“迴文”是指順讀和倒讀都一樣的字串。如“XYZYX”和“xyzzyx”都是迴文。 函式介面定義: b

判斷是否是數字java版

//123321,678876,829928這種兩端對稱的為迴文數字 /* 採用倒轉法,將數字倒轉再來對比   */ public class Huiwenshuzi {         public boo

演算法題4:python3實現

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。 示例 1: 輸入: 121 輸出: true 示例 2: 輸入: -121 輸出: false 解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴

LeetCode題目--驗證字串python實現

題目 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫。 說明:本題中,我們將空字串定義為有效的迴文串。 示例 1: 輸入: "A man, a plan, a canal: Panama" 輸出: true 示例 2:

ZZULIOJ.1106: 函式專題

1106: 迴文數(函式專題) 題目描述 一個正整數,如果從左向 右讀(稱之為正序數)和從右向左讀(稱之為倒序數)是一樣的,這樣的數就叫回文數。輸入兩個整數m和n(m<n),輸出區間[m,n]之間的迴文數。 輸入 輸入兩個正整數m和n,輸入保證m<n。 輸出 按從

Partitioning by Palindromes—最小組成區間dp

題目連結:Partitioning by Palindromes UVA - 11584  題意:輸入一個有小寫字母組成的字串,你的任務是將它劃分成儘量少的迴文串 思路:dp[i]代表到第i位的最小值,列舉它的前幾位求出最小值,為了方便列舉整個長度我們 從str[1

ZZULIOJ 1106: 函式專題

題目描述 一個正整數,如果從左向 右讀(稱之為正序數)和從右向左讀(稱之為倒序數)是一樣的,這樣的數就叫回文數。輸入兩個整數m和n(m<n),輸出區間[m,n]之間的迴文數。    輸入 輸入兩個正整數m和n,輸入保證m<n。  &n

【LeetCode題解】9_Palindrome-Number

9_迴文數(Palindrome-Number) 文章目錄 9_迴文數(Palindrome-Number) 描述 解法一:轉化為字串的比較 思路 Java 實現 Python 實現 複雜

【LeetCode】125. 驗證Valid Palindrome

【 英文練習 | 中文練習 】 題目描述: 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,忽略字母的大小寫。 解題思路: 用雙指標的思想,從字串的頭部與尾部向中間移動比較。 public boolean isPalindrome(String s) { if

1079 延遲的20 分

1079 延遲的迴文數 (20 分) 給定一個 k+1 位的正整數 N,寫成 a​k​​⋯a​1​​a​0​​ 的形式,其中對所有 i 有 0≤a​i​​<10 且 a​

PAT乙級 1079 延遲的20 分

給定一個 k+1 位的正整數 N,寫成 ak⋯a1a0的形式,其中對所有 i 有 0≤ai<10 且 ak>0。N 被稱為一個迴文數,當且僅當對所有 i 有 ai=ak-i。零也被定義為一個迴文數。 非迴文數也可以通過一系列操作變出迴文數。首先將該數字逆轉,再將逆轉數與該數相

Prime Palindromes 質數暴力構造

Description 因為151即是一個質數又是一個迴文數(從左到右和從右到左是看一樣的),所以 151 號是迴文質數。 寫一個程式來找出範圍[a,b](5 <= a < b <= 100,000,000)間的所有迴文質數; Input 第 1 行:

LeetCode : 866. 素數Prime Palindrome分析和解答

866. 迴文素數 求出大於或等於 N 的最小回文素數。 回顧一下,如果一個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。 例如,2,3,5,7,11 以及 13 是素數。 回顧一下,如果一個數從左往右讀與從右往左讀是一樣的,那麼這個數是迴文數。 例