求满足 Str1<Str<Str2 且 0<Str.length <=len 的字符串个数

//通过一些测试用例,但没有确定完全正确,望发现者能够给予指正,感谢!
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
//计算 26^start + 26^(start+1) + ... + 26^endm
int compute26(int start,int endm){
    int sum = 0,i;
    //为满足此题需要这里返回1
    if(start > endm){
        return 1;
    }
    for (i = start;i <= endm;i ++)
    {
        //pow(x,y)求x的y次方
        sum += pow(26,i);
    }
    return sum;
}
//输入两个字符串和长度,计算并返回结果
int ins1s2(){
    int sum = 0,len = 0,i = 0,j;
    string s1,s2;
    cin>>s1>>s2>>len;
    //字符串相等、字符串1大于字符串2、长度为0:返回0
    if(s1 >= s2 || len == 0){
        cout<<"相等"<<endl;
        return sum;
    }
    //找到第一个不一样的字母
    while(s1[i] == s2[i]){
        i ++;
        len --;
    }
    //长度为0:返回0
    if (len == 0)
    {
        cout<<"长度为0"<<endl;
        return sum;
    }
    //将从第一个相同位置不同字符到最后的字符串提取出来
    if (i != 0){
        j = s1.length()-i;
        if (j == 0)
        {
            s1 = "";
        }else{
            s1 = s1.substr(i,s1.length()-i+1);
        }
        //满足s1<s2时,s2不会为空
        s2 = s2.substr(i,s2.length()-i+1);
        cout<<"S1:"<<s1<<endl;
        cout<<"S2:"<<s2<<endl;
    }
    //从第二个字符开始比较,计算以s1[0]开始的符合条件的第1部分
    if (s1.length() == 1)//当s1的长度==1
    {
        sum += compute26(1,len-1);
        cout<<"走完S1:"<<sum<<endl;
    }else//当s1的长度>=2时
    {
        for (i = 1;i < s1.length();i ++)
        {
            if (i == s1.length()-1)
            {
                sum += ('z'-s1[i]+1)*compute26(0,len-i-1);
                //减去s1
                sum --;
                cout<<"走完S1:"<<sum<<endl;
            }else{
                sum += ('z'-s1[i])*compute26(0,len-i-1);
                cout<<"-S1:"<<i<<" 此时:"<<sum<<endl;
            }
        }
    }
    //计算打头字母为s1[0]-s2[0]之间的第2部分
    if (s1.length() == 0 && s2[0] != 'a')
    {
        sum += (s2[0]-'a')*compute26(0,len-1);
    }else if ((s2[0]-s1[0]) != 1){
        sum += (s2[0]-s1[0]-1)*compute26(0,len-1);
    }
    cout<<"-----中间:"<<sum<<endl;
    //从第二个字符开始比较,计算以s2[0]开始符合条件的第3部分,当s2长度等于1不计算
    for (i = 1;i < s2.length();i ++)
    {
        if (i == s2.length()-1)
        {
            sum += s2[i] - 'a';
            //加上s2[0]
            sum ++;
            cout<<"走完S2:"<<sum<<endl;
        }else{
            sum += (s2[i]-'a')*compute26(0,len-i-1);
            cout<<"-S2:"<<i<<" 此时:"<<sum<<endl;
        }
    }
    return sum;
}
int main(){
    //输出结果
    cout<<ins1s2()<<endl;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是用 C 语言编写的示例代码,用于解决上述问题: ``` #include <stdio.h> #include <string.h> #define MAX_LEN 10000 int max(int a, int b) { return a > b ? a : b; } int main(int argc, char* argv[]) { char str[MAX_LEN + 1]; scanf("%s", str); int len = strlen(str); int dp[len][len]; memset(dp, 0, sizeof(dp)); int i, j; int ans = 1; for (i = 0; i < len; i++) { dp[i][i] = 1; if (i < len - 1 && str[i] == str[i + 1]) { dp[i][i + 1] = 1; ans = 2; } } for (i = len - 1; i >= 0; i--) { for (j = i + 2; j < len; j++) { if (str[i] == str[j] && dp[i + 1][j - 1] == 1) { dp[i][j] = 1; ans = max(ans, j - i + 1); } } } printf("%d\n", ans); return 0; } ``` 上述代码使用动态规划的思想来解决问题。具体来说,我们定义一个二维数组 `dp[i][j]` 表示子串 `str[i]` 到 `str[j]` 是否为回文串。然后从小到大枚举区间的长度,从小到大枚举左端点,出 `dp[i][j]` 的值。具体来说,对于固定长度和左端点的区间 `[i, j]`,如果它是回文串,则需要满足下列条件: - 字符 `str[i]` 和字符 `str[j]` 相同。 - 子串 `str[i+1]` 到 `str[j-1]` 是回文串。 在出所有的 `dp[i][j]` 值之后, ### 回答2: 题目要我们在给定的字符串中找到最长的回文串,并输出其长度。下面是一种用C语言编写的解法示例: ```c #include<stdio.h> #include<string.h> int longestPalindrome(char* str) { int len = strlen(str); // 字符串的长度 int dp[len][len]; // dp数组用于记录回文子串的长度 int maxLength = 1; // 最长回文串的长度初始化为1 // 初始化dp数组 memset(dp, 0, sizeof(dp)); // 计算长度为1的子串是否是回文子串 for (int i = 0; i < len; i++) { dp[i][i] = 1; } // 计算长度大于1的子串是否是回文子串 for (int l = 2; l <= len; l++) { for (int i = 0; i < len - l + 1; i++) { int j = i + l - 1; if (str[i] == str[j] && l == 2) { dp[i][j] = 2; } else if (str[i] == str[j]) { dp[i][j] = dp[i + 1][j - 1] + 2; } else { dp[i][j] = dp[i][j - 1] > dp[i + 1][j] ? dp[i][j - 1] : dp[i + 1][j]; } if (dp[i][j] > maxLength) { maxLength = dp[i][j]; } } } return maxLength; } int main() { char str[10001]; gets(str); int length = longestPalindrome(str); printf("%d\n", length); return 0; } ``` 该解法使用动态规划的思想,通过计算所有可能的子串是否为回文子串,并记录其长度。最终返回最长回文串的长度。 ### 回答3: 题目要编写一个程序,输入一个字符串s,输出字符串s中最长回文串的长度。 解题思路: 1. 首先定义一个变量maxLen,用于记录最长回文串的长度,初始值为0。 2. 遍历字符串s的所有子串,分别判断每个子串是否为回文串。 3. 判断回文串的方法是,将子串反转得到reverseStr,若reverseStr与子串相等,则子串为回文串。 4. 若子串是回文串且长度大于maxLen,则更新maxLen的值。 5. 最终输出maxLen即为最长回文串的长度。 示例代码如下(用C语言实现): ```c #include <stdio.h> #include <string.h> int longestPalindrome(char* s) { int maxLen = 0; int len = strlen(s); for (int i = 0; i < len; i++) { for (int j = i; j < len; j++) { int isPalindrome = 1; for (int k = i; k <= (i + j) / 2; k++) { if (s[k] != s[j - (k - i)]) { isPalindrome = 0; break; } } if (isPalindrome && (j - i + 1) > maxLen) { maxLen = j - i + 1; } } } return maxLen; } int main() { char s[10001]; scanf("%s", s); int answer = longestPalindrome(s); printf("%d\n", answer); return 0; } ``` 说明:该示例代码通过三层循环遍历所有子串,并用一个isPalindrome变量判断子串是否是回文串,最后返回最长回文串的长度。 注意事项:示例代码仅供参考,实际应用时可以根据需要做进一步优化,以提高程序的执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值