找出两个或者多个字符串中最大的公共串,最大的整数,最长的整数

一 找出两个字符串中最大的公共字串

#include "stdio.h"      
#include "malloc.h"      
#include "string.h"      
    
char *maxsubstr(char *str1, char *str2)    
{    
   char *p1, *p2, *q1, *q2, *destp;    
   char *substr;    
   int max = 0, len;    
   p1 = str1;    
   while(*p1 != '\0')    
   {    
       q1 = str2;    
       while(*q1 != '\0')    
       {    
          len = 0;  //这部分初始化非常重要,要注意好!   
          p2 = p1;    
          q2 = q1;    
          while((*p2 != '\0')&&(*q2 != '\0'))    
          {    
              if(*p2 == *q2)    
              {    
                  p2 ++;q2 ++;len ++;    
              }    
              else    
              {   
                  break;    
              }    
          }    
          if(len > max)    
          {    
              max = len;    
              destp =p1;    
          }    
          q1++;    
       }    
       p1++;    
   }    
   substr=(char*)malloc(sizeof(char)*max);    
   strncpy(substr,destp,max);    
   substr[max] = '\0';  
   return substr;    
}   
    
int main()    
{    
  char *s1="aocdfe";    
  char *s2="pmcdfa";    
  char *sub;    
  printf("%s\n%s\n",s1,s2);    
  sub = maxsubstr(s1,s2);    
  printf("the max sub string is:%s\n",sub);     
  return 0;    
}   

多个字符串最大的公共子字符串

#include <iostream>
#include <string>

using namespace std;

//将第一个字符串与最短的字符串交换
void swap(string *pStr,int i)
{
    string temp;
    temp = *pStr;
    *pStr = *(pStr + i);
    *(pStr + i) = temp;
}
char* findSameSubStr(char**asd, int N)
{
	int i,j,k,len,min,maxLen = 0,minLen = 256;
	
	string maxStr,tmpStr,*pStr = new string [N];
   
    //找出输入的字符串中长度最小的串,并把最小串序号记在min中
    for(i = 0; i < N; ++ i)
	{
        *(pStr + i) = asd[ i ];

		// *操作符与调用函数的.操作符优先级问题,.优先级高于*,所以必须加上()
        len = (*(pStr +i)).length();

		//find the minimal length of the string
        if( len < minLen)
		{   
			minLen = len;
            min = i;
        }
    }
	
	//swap the string and put the minimal string in the first
	//printf("the minimal length string = %d\n",min);
    swap(pStr,min);
    
    len = pStr[0].length();   
    for(i = 0; i < len && maxLen <= len - i - 1; ++ i)
    {
        for(j = 0; j < len && maxLen <= len - i - j - 1; ++ j)
        {
			//对字符串数组中第一个子串,求出其可能的子串值,如果剩余子串长度小于maxLen则不用去求了,for循环中给出了限制
            tmpStr = pStr[0].substr(i, len - j);
            //将子串tmpStr与参与匹配的字符串比较,判断tmpStr是否为剩余串的子串,如果不是则break出循环
            for(k = 1; k < N; ++ k)
            {
                string::size_type pos = pStr[k].find(tmpStr);
                if(pos < pStr[ k ].length())
                    continue;
                else
                    break;
            }
            if(k == N)//说明子串tmpStr是其他参与匹配的子串的子串
            {
                if(tmpStr.length() > maxLen)//tmpStr如果是当前最大的子串,则记录下来
                {
                    maxLen = tmpStr.length();
                    maxStr = tmpStr;
                }
            }
        }
    }
	char * maxstr = new char [maxStr.length() + sizeof(char)];

	strcpy(maxstr,maxStr.c_str());

    delete []pStr;

	return  maxstr;
}

int main()
{
    int N = 3;  
	/*
    string *pStr;

    pStr = new string [N];

	pStr[0] = "main what is local bus";

	pStr[1] = "main this is local bus";

	//pStr[2] = "local bus is name sdhfj";
	pStr[2]  = "main";
	*/
	//char *asd[ 3 ] = {"main what is local bus","main this is local bus","main my name is tian mo thank you very much"};
	char *asd[ 3 ] = {"mainttianmomomo","hthhttmainttgggsdjfsjdfsdf","fsadfasdfsamainttoewrowjfjsjfldsmflasjdfljslfls"};

	printf("最大公共子串为:%s\n",findSameSubStr(asd, N));
   
    return 0;
}

二 找出字符串中最大的整数

int _FindMaxData(const char *str)
{
	if(NULL == str)
		return 0;

    int temp, flag, max = 0;

	const char *p = str;

    while ('\0' != *p)
    {
        temp = 0;
        flag = 0;//设置是否有整数的标志

        while (*p >= '0' && *p <= '9')
        {
            temp = 10 * temp + *p - '0';

            ++ p;

            flag = 1;
        }

        if (flag)
        {
			if(max < temp)
			{
				max = temp;
			}
            
            -- p;//由于在存整数的时候多走了一步,要减1
        }
        ++ p;
    }

	return max;
}
void main()
{
	char str[] = "A5C6B9572DDEF6912YY9573GG12345II001234";

	printf("max = %d\n",_FindMaxData(str));
}

三 找出字符串中最大的由0-9组成的串

int _FindMaxData(const char *str)
{
	if(NULL == str)
		return 0;

    int temp, flag, max = 0;

	const char *p = str;

    while ('\0' != *p)
    {
        temp = 0;
        flag = 0;//设置是否有整数的标志

        while (*p >= '0' && *p <= '9')
        {
            //temp = 10 * temp + *p - '0';
			temp ++;

            ++ p;

            flag = 1;
        }

        if (flag)
        {
			if(max < temp)
			{
				max = temp;
			}
            
            -- p;//由于在存整数的时候多走了一步,要减1
        }
        ++ p;
    }

	return max;
}
void main()
{
	char str[] = "A5C6B9572DDEF6912YY9573GG12345II001234";

	printf("max = %d\n",_FindMaxData(str));
}

四 


待续 。。。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 回文子是指正着读和倒着读都一样的字符串。要找出一个字符串最长的回文子。 解决这个问题的方法有很多,其一种比较简单的方法是暴力枚举。具体来说,我们可以枚举所有可能的子,然后判断每个子是否是回文,最后找出最长的回文子。 具体实现时,我们可以从字符串的第一个字符开始,依次枚举所有可能的子。对于每个子,我们可以使用双指针法来判断它是否是回文。具体来说,我们可以使用两个指针分别指向子的首尾字符,然后依次向间移动,判断对应的字符是否相等。如果所有字符都相等,那么这个子就是回文。 在判断完所有子之后,我们就可以找出最长的回文子了。具体来说,我们可以用一个变量来记录当前找到的最长回文子的长度,以及它的起始位置。在枚举所有子的过程,如果找到了一个更长的回文子,那么就更新这个变量。 需要注意的是,由于字符串可能存在偶数长度的回文子,因此我们需要分别枚举以每个字符为心的奇数长度回文子和以每两个相邻字符为心的偶数长度回文子。 这种暴力枚举的方法时间复杂度为O(n^3),其n是字符串的长度。虽然时间复杂度比较高,但是这种方法比较简单易懂,可以作为其他更高效的算法的基础。 ### 回答2: 回文子是指正着读和倒着读一样的字符串。例如,'level'和'noon'就是回文子。编写程序来寻找给定字符串最长的回文子。 一种常见的方法是暴力枚举字符串的所有子并检查它们是否是回文。这种方法的时间复杂度为O(n^3),不适用于长字符串。另一种常见的方法是动态规划。这种方法的时间复杂度为O(n^2),适用于较长的字符串。 动态规划方法的主要思路如下: 1.定义状态:dp[i][j]表示从i到j的子是否为回文。 2.初始化状态:对于所有i,dp[i][i]都是true。 3.状态转移:当s[i] = s[j]时,如果dp[i+1][j-1]是true,那么dp[i][j]也是true。 4.记录最长回文子的起始位置和长度:遍历dp数组,找到值为true且长度最大的子即可。 下面是一个Python实现的例子: ```python def longest_palindrome(s:str) -> str: if not s: # 处理输入为空的情况 return "" n = len(s) dp = [[False] * n for _ in range(n)] # 初始化dp数组 start, max_len = 0, 1 # 记录最长回文子的起始位置和长度 for i in range(n): # 初始化对角线上的状态 dp[i][i] = True for j in range(1, n): for i in range(0, j): if s[i] == s[j]: if j - i < 3: # 特判长度小于3的情况 dp[i][j] = True else: dp[i][j] = dp[i+1][j-1] else: dp[i][j] = False if dp[i][j]: # 记录最长回文子的起始位置和长度 if j - i + 1 > max_len: max_len = j - i + 1 start = i return s[start:start+max_len] ``` 该算法的时间复杂度为O(n^2),空间复杂度也为O(n^2)。 ### 回答3: 回文指正着读和倒着读都一样的字符串,例如 "level", "noon" 等。在一个字符串,可能不存在回文子,也可能存在多个长度相同的回文子。现在给定一个字符串,需要我们出其最长的回文子。 解决此问题,可以用动态规划算法。假设字符串的长度为 n,定义一个二维数组 dp (n * n),其 dp[i][j] 表示从 i 到 j 这一段字符串是否为回文。当字符串为空或长度为 1 时,皆为回文(即 dp[i][i] = true)。当字符串长度大于等于 2 时,若第 i 个字符和第 j 个字符相等,且从 i + 1 到 j - 1 的字符串也是回文,那么从 i 到 j 的字符串也是回文(即 dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j])。此外,记录回文子的起始位置和长度,最终找到最长的回文子即可。 以下是 Python 代码实现: ``` class Solution: def longestPalindrome(self, s: str) -> str: n = len(s) dp = [[False] * n for _ in range(n)] res = "" for i in range(n - 1, -1, -1): for j in range(i, n): dp[i][j] = s[i] == s[j] and (j - i < 3 or dp[i + 1][j - 1]) if dp[i][j] and j - i + 1 > len(res): res = s[i:j+1] return res ``` 时间复杂度为 O(n^2),空间复杂度为 O(n^2)。总的来说,动态规划算法是解决最长回文子问题的一种行之有效的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值