`
duoerbasilu
  • 浏览: 1541794 次
文章分类
社区版块
存档分类
最新评论

对称子字符串的最大长度

 
阅读更多
【题 目】输入一个字符串,输出该字符串中最大对称子串的长度。例如输入字符串:“google”,该字符串中最长的子字符串是“goog”,长度为4,因而输出为4。

  【思 路1】一看这题就是遍历!没错,我们最直观的往往也是最容易实现的,这里我们暂且不考虑效率的问题。我们的基本思路是:我们如果有一个判断一个字符串是不是对称的函数的话,我们就可以用这个子函数逐一检查原字符串中所有的字符串,然后输出长度最大的即可。

  (1)怎样判断一个字符串是不是对称的字符串?我们可以用两个指针分别指向字符串的第一个字符和最后一个字符,判断是否相等,如果不等直接返回false,如果为真则接着比较下一对字符。(2)如果遍历遍历原字符串的所有子串,首先我们让一个指针从头至尾遍历,对于这个指针的每一个字符,我们在用另一个指针逐一指向它后面的每一个字符即可。好了,两个问题都解决了,我们可以写出如下的代码:

解法一:On3)的算法

现在我们试着来得到对称子字符串的最大长度。最直观的做法就是得到输入字符串的所有子字符串,并逐个判断是不是对称的。如果一个子字符串是对称的,我们就得到它的长度。这样经过比较,就能得到最长的对称子字符串的长度了。于是,我们可以写出如下代码:

// IsSymmetricalString2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

/************************************************
* 判断一个字符串是否是对称的
*************************************************/

bool IsSymmetricalString(char* pstart,char* pend)
{
if (pstart==NULL || pend==NULL || pstart>pend)
{
return false;
}
while (pstart<pend)
{
if (*pstart!=*pend)
{
return false;
}
pstart++;
pend--;
}
return true;
}

/*************************************************
* 求最大对称子串的长度
**************************************************/
int MaxSymmetricalSubstringLenth(char *pstring)
{
if (pstring==NULL)
{
return 0;
}
int maxLength=1;
int length=strlen(pstring);
char* pstart=pstring;
while (pstart<&pstring[length-1])
{
char* psecond=pstart+1;
while (psecond<=&pstring[length-1])
{
if (IsSymmetricalString(pstart,psecond))
{
int tempLength=psecond-pstart+1;
if (tempLength>maxLength)
{
maxLength=tempLength;
}
}
psecond++;
}
pstart++;
}
return maxLength;
}


int _tmain(int argc, _TCHAR* argv[])
{
cout<<"Please Enter Your String(the length must <1000 ):"<<endl;
char* yourstring = new char[1000];
cin>>yourstring;
cout<<"The Max Symmetrical SubString Length in Your String is:"<<endl;
cout<<MaxSymmetricalSubstringLenth(yourstring)<<endl;


system("pause");
return 0;
}

// IsSymmetricalString2.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;

 /************************************************
 * 判断一个字符串是否是对称的
 *************************************************/

bool IsSymmetricalString(char* pstart,char* pend)
{
	if (pstart==NULL || pend==NULL || pstart>pend)
	{
		return false;
	}
	while (pstart<pend)
	{
		if (*pstart!=*pend)
		{
			return false;
		}
		pstart++;
		pend--;
	}
	return true;
}

 /*************************************************
 * 求最大对称子串的长度
 **************************************************/
int MaxSymmetricalSubstringLenth(char *pstring)
{
	if (pstring==NULL)
	{
		return 0;
	}
	int maxLength=1;
	int length=strlen(pstring);
	char* pstart=pstring;
	while (pstart<&pstring[length-1])
	{
		char* psecond=pstart+1;
		while (psecond<=&pstring[length-1])
		{
			if (IsSymmetricalString(pstart,psecond))
			{
				int tempLength=psecond-pstart+1;
				if (tempLength>maxLength)
				{
					maxLength=tempLength;
				}
			}
			psecond++;
		}
		pstart++;
	}
	return maxLength;
}


int _tmain(int argc, _TCHAR* argv[])
{
	cout<<"Please Enter Your String(the length must <1000 ):"<<endl;
	char* yourstring = new char[1000];
	cin>>yourstring;
	cout<<"The Max Symmetrical SubString Length in Your String is:"<<endl;
	cout<<MaxSymmetricalSubstringLenth(yourstring)<<endl;


	system("pause");
	return 0;
}


我们来分析一下上述方法的时间效率。由于我们需要两重while循环,每重循环需要On)的时间。另外,我们在循环中调用了IsSymmetrical,每次调用也需要On)的时间。因此整个函数的时间效率是On3)。

通常On3)不会是一个高效的算法。如果我们仔细分析上述方法的比较过程,我们就能发现其中有很多重复的比较。假设我们需要判断一个子字符串具有aAa的形式(AaAa的子字符串,可能含有多个字符)。我们先把pFirst指向最前面的字符a,把pLast指向最后面的字符a,由于两个字符相同,我们在IsSymtical函数内部向后移动pFirst,向前移动pLast,以判断A是不是对称的。接下来若干步骤之后,由于A也是输入字符串的一个子字符串,我们需要再一次判断它是不是对称的。也就是说,我们重复多次地在判断A是不是对称的。

造成上述重复比较的根源在于IsSymmetrical的比较是从外向里进行的。在判断aAa是不是对称的时候,我们不知道A是不是对称的,因此需要花费On)的时间来判断。下次我们判断A是不是对称的时候,我们仍然需要On)的时间。

解法二:On2)的算法

如果我们换一种思路,我们从里向外来判断。也就是我们先判断子字符串A是不是对称的。如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的。如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则延长后的字符串是对称的。因此在知道A是否对称之后,只需要O1)的时间就能知道aAa是不是对称的。

我们可以根据从里向外比较的思路写出如下代码

// MaxSymmetricalSubstringLenth.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<iostream>
#include<string>
using namespace std;

/*********************************************************************
* 计算字符串最大对称子串的长度
*********************************************************************/

int GetLongestSymmetricalLength_2(char* pString)
{
if(pString == NULL)
return 0;
int symmeticalLength = 1;
char* pChar = pString;
while(*pChar != '\0')
{
// Substrings with odd length(奇数)
char* pFirst = pChar - 1;
char* pLast = pChar + 1;
while(*pLast != '\0' && *pFirst == *pLast)
{
pFirst--;
pLast++;
}
int newLength = pLast - pFirst - 1;
if(newLength > symmeticalLength)
symmeticalLength = newLength;
// Substrings with even length(偶数)
pFirst = pChar;
pLast = pChar + 1;
while( *pLast != '\0' && *pFirst == *pLast)
{
pFirst--;
pLast++;
}
newLength = pLast - pFirst - 1;
if(newLength > symmeticalLength)
symmeticalLength = newLength;
pChar++;
}
return symmeticalLength;

}



int main()
{
cout<<"Please Enter Your String:"<<endl;
char *yourstring = new char[1000];
cin>>yourstring;

cout<<"The Max Symmetrical SubString Length is:"<<endl;
cout<<GetLongestSymmetricalLength_2(yourstring)<<endl;

delete[] yourstring;

system("pause");
return 0;

}

// MaxSymmetricalSubstringLenth.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"

#include<iostream>
 #include<string>
 using namespace std;
 
 /*********************************************************************
 * 计算字符串最大对称子串的长度
 *********************************************************************/

 int GetLongestSymmetricalLength_2(char* pString)
 {
	 if(pString == NULL)
		 return 0;
	 int symmeticalLength = 1;
	 char* pChar = pString;
	 while(*pChar != '\0')
	 {
		 // Substrings with odd length(奇数)
		 char* pFirst = pChar - 1;
		 char* pLast = pChar + 1;
		 while(*pLast != '\0' && *pFirst == *pLast)
		 {
			 pFirst--;
			 pLast++;
		 }
		 int newLength = pLast - pFirst - 1;
		 if(newLength > symmeticalLength)
			 symmeticalLength = newLength;
		 // Substrings with even length(偶数)
		 pFirst = pChar;
		 pLast = pChar + 1;
		 while(  *pLast != '\0' && *pFirst == *pLast)
		 {
			 pFirst--;
			 pLast++;
		 }
		 newLength = pLast - pFirst - 1;
		 if(newLength > symmeticalLength)
			 symmeticalLength = newLength;
		 pChar++;
	 }
	 return symmeticalLength;

 }


 
 int main()
 {
     cout<<"Please Enter Your String:"<<endl;
     char *yourstring = new char[1000];
     cin>>yourstring;
 
     cout<<"The Max Symmetrical SubString Length is:"<<endl;
     cout<<GetLongestSymmetricalLength_2(yourstring)<<endl;
 
     delete[] yourstring; 

	 system("pause");
     return 0;

}


分享到:
评论

相关推荐

    使用C语言提取子字符串及判断对称子字符串最大长度

    5. **对称子字符串最大长度**: - 对称子字符串是指一个字符串,其反转后的字符串与原字符串相同。例如,“aba”就是一个对称子字符串。要找出最长的对称子字符串,我们可以使用动态规划或者双指针的方法。对于每个...

    c语言输出字符串中最大对称子串长度的3种解决方案

    在C语言中,寻找字符串的最大对称子串长度是一个经典的字符串处理问题。对称子串是指一个字符串,其正读和反读完全一样,比如"abcba"就是一个对称子串。以下将详细介绍三种解决这个问题的方案。 首先,最直观但效率...

    统计字符串中“子字符串”的个数

    1. **滑动窗口法**:通过设定一个固定长度的窗口(等于子字符串长度)在主字符串上滑动,每次比较窗口内的内容与子字符串是否相等。这种方法适用于无重叠且不需要正则匹配的情况。 2. **KMP算法**(Knuth-Morris-...

    最大对称字符串的算法

    在给定的题目中,目标是找到输入字符串中最长的对称子字符串,并返回它的长度。 首先,我们来看第一种解决方案,它的复杂度是 O(n^3)。这个算法通过两层嵌套循环遍历字符串的所有可能的子串,然后用一个辅助函数 `...

    AES.rar_AES 任意_AES任意字符串_字符串aes加密_字符串加密

    在本主题中,我们关注的是AES算法在处理任意长度字符串时的应用。通常,对于任意长度的输入字符串,我们需要进行预处理,以确保它们能够适应AES的块大小。一种常见的方法是采用填充方式,如PKCS7填充,使得输入数据...

    C#编写的字符串、异常处理程序

    - `endswith`:检查字符串是否以指定的子字符串结尾。 - `equals`:比较两个字符串是否相等。 - `insert`:在字符串的某个位置插入另一个字符串。 - `split`:根据分隔符将字符串分割成字符串数组。 - `tolower...

    字符串中的最长重复串

    它利用了字符串的对称性,减少了重复计算,提高了效率。 无论采用哪种方法,都需要考虑以下关键步骤: - 初始化状态,例如,最长重复子串的长度和起始位置。 - 遍历字符串,逐字符处理,更新状态。 - 记录重复子串...

    OJ_字符串加解密

    4. **字符串处理函数**:C语言中的`strlen()`用于获取字符串长度,`strcpy()`和`strncpy()`用于复制字符串,`strcat()`和`strncat()`用于连接字符串,`strchr()`和`strstr()`用于查找子字符串,这些函数可以辅助我们...

    求字符串的最长平台

    标题中的“求字符串的最长平台”实际上是指寻找一个数组中具有相同值的连续子序列的最大长度,这在数据结构和算法领域中是一个常见的问题。在C语言编程中,这个问题可以通过遍历数组并比较相邻元素来解决。从给出的...

    字符串加密解密

    5. **哈希与摘要**:除了加密,还可以使用哈希函数(如MD5、SHA系列)对字符串进行单向处理,生成固定长度的摘要,用于数据完整性验证。哈希函数不可逆,无法从摘要恢复原始数据,常用于密码存储。 6. **安全协议**...

    QT C++ AES字符串加密解密类库,引入即可使用

    4. 错误处理和边界检查:确保输入的字符串长度和格式符合要求,防止空指针、内存溢出等问题。 5. 示例代码:为了方便用户快速上手,类库通常会提供示例代码,展示如何创建密钥、设置IV、调用加密和解密函数,以及...

    字符串加密算法

    在IT领域,字符串加密算法是保护信息安全的重要手段。本文将深入探讨两个常见的对称加密算法:AES(高级加密标准)和BlowFish,并结合Qt框架介绍如何实现它们的加密和解密功能。同时,我们将讨论如何将这些算法封装...

    c++字符串加密解密

    学习了C++中的字符串加密解密后,可以进一步研究其他加密算法,如AES、RSA等,或者了解非对称加密和哈希函数等信息安全相关的概念和技术。此外,也可以尝试将加密解密技术应用到实际项目中,如网络通信的安全传输、...

    字符串最长回文实现

    在编程领域,字符串处理是常见的任务之一,而寻找字符串中的最长回文子串是一个经典问题。回文是指正读反读都一样的字符串,比如“上海自来水来自海上”。本篇文章将探讨如何实现寻找一个字符串中最长回文子串的算法...

    IT软件开发笔试面试题.docx

    6. 对称子字符串:该题目要求编写一个函数,输出字符串中对称的子字符串的最大长度,考察了候选人的字符串处理能力和算法设计能力。 知识点:字符串处理、对称算法。 7. 字符串压缩:该题目要求编写一个函数,实现...

    字符串相关算法.rar

    3. **Manacher's Algorithm**:用于求解字符串中最长回文子串,该算法通过巧妙地利用对称性,将时间复杂度降低到线性。理解Manacher算法的关键在于如何维护回文半径和中心位置。 4. **Z-Algorithm**:一种在线的...

    Chapter 5 字符串 Strings.rar_核心算法-string部分

    10. **动态规划在字符串问题中的应用**:许多字符串问题可以通过动态规划求解,如编辑距离、最长公共子序列、最长递增子序列等。 以上就是普林斯顿算法课"Chapter 5 字符串 Strings"部分涵盖的一些核心算法,这些...

    关于字符串加密解密 DES加密解密

    ### 字符串加密解密——DES加密解密详解 #### 一、概述 在现代信息技术领域,数据安全显得尤为重要。为了保护数据不被未授权访问或窃取,加密技术成为了必不可少的一部分。其中,**DES(Data Encryption Standard...

Global site tag (gtag.js) - Google Analytics