【2022.12.15每天四个简单题之简单题大智慧系列9】( 字符串乘方,字符串最大跨距,最长公共字符串后缀,打印数字 )

字符串乘方

给定两个字符串 a 和 b,我们定义 a×b 为他们的连接。

例如,如果 a=abc 而 b=def, 则 a×b=abcdef。

如果我们将连接考虑成乘法,一个非负整数的乘方将用一种通常的方式定义:a0=``(空字符串),a(n+1)=a×(an)。

输入格式
输入包含多组测试样例,每组测试样例占一行。

每组样例包含一个字符串 s,s 的长度不超过 100,且不包含空格。

最后的测试样例后面将是一个点号作为一行。

输出格式
对于每一个 s,你需要输出最大的 n,使得存在一个字符串 a,让 s=an。

输入样例:
abcd
aaaa
ababab
.
输出样例:
1
4
3
定义了一个乘法,就是将两个相乘的字符串连接起来
此题的意思是:定义一个字符串,说明该字符串是由某个字串最多重复几次而形成的,故而我们可以取每一小段进行测试看看原字符串可不可以由这个字串重复而取得,我们从小到大开始枚举,这样第一个答案一定就是重复次数最多的。
故而我们有了以下代码:

#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    string str;
    while(cin>>str,str!="."){
        int m,n;
        m=str.size();
        for(n=m;n>=0;n--){
            if(m%n==0){
                string c;
                for(int i=0;i<n;i++){
                    c+=str.substr(0,m/n);
                }
                if(c==str){
                    cout<<n<<endl;
                    break;
                }
            }
        }
    }
    return 0;
}

如果是java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            String str = sc.next();
            if (str.equals(".")) break;

            int n = str.length();
            for (int i = 1; i <= n; i ++ )
                if (n % i == 0) {
                    String s = str.substring(0, i);
                    String r = "";
                    for (int j = 0; j < n / i; j ++ )
                        r += s;
                    if (r.equals(str)) {
                        System.out.println(n / i);
                        break;
                    }
                }
        }
    }
}

字符串最大跨距

有三个字符串 S,S1,S2,其中,S 长度不超过 300,S1 和 S2 的长度不超过 10。

现在,我们想要检测 S1 和 S2 是否同时在 S 中出现,且 S1 位于 S2 的左边,并在 S 中互不交叉(即,S1 的右边界点在 S2 的左边界点的左侧)。

计算满足上述条件的最大跨距(即,最大间隔距离:最右边的 S2 的起始点与最左边的 S1 的终止点之间的字符数目)。

如果没有满足条件的 S1,S2 存在,则输出 −1。

例如,S= abcd123ab888efghij45ef67kl, S1= ab, S2= ef,其中,S1 在 S 中出现了 2 次,S2 也在 S 中出现了 2 次,最大跨距为:18。

输入格式
输入共一行,包含三个字符串 S,S1,S2,字符串之间用逗号隔开。

数据保证三个字符串中不含空格和逗号。

输出格式
输出一个整数,表示最大跨距。

如果没有满足条件的 S1 和 S2 存在,则输出 −1。

输入样例:
abcd123ab888efghij45ef67kl,ab,ef
输出样例:
18
我们可以将题意理解为:先从左边开始遍历找到第一个s1的最右端,再从尾端开始遍历找到第一个s2的最左端,然后计算两个字符串之间的距离就可以了
代码如下:

#include<iostream>
using namespace std;
int main()
{
    string str,s1,s2;
    char c;
    while(cin>>c,c!=',')str+=c;
    while(cin>>c,c!=',')s1+=c;
    while(cin>>c)s2+=c;
    if(str.size()<s1.size()||str.size()<s2.size()){//如果输入不科学
        puts("-1");
    }else{
        int l=0;
        while(l+s1.size()<str.size()){//只要没有循环完str就可以一直循环知道找到s1
            int k=0;
            //开始找s1
            while(k<s1.size()){
                if(s1[k]!=str[k+l]){
                    break;
                }
                k++;
            }
            if(k==s1.size())break;
            l++;
        }
        int m=str.size()-s2.size();
        //开始找s2
        while(m>=0){
            int k=0;
            while(k<s2.size()){
                if(str[m+k]!=s2[k])break;
                k++;
            }
            if(k==s2.size())break;
            m--;
        }
        l+=s1.size()-1;
        if(l>=m){
            puts("-1");
        }
        else{
            printf("%d",m-l-1);
        }
    }
    return 0;
}

如果要是java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] strs = sc.next().split(",");//用逗号隔开
        String s = strs[0], a = strs[1], b = strs[2];
        int x = s.indexOf(a), y = s.lastIndexOf(b);//寻找左右边界
        if (x != -1 && y != -1 && x + a.length() - 1 < y)
            System.out.println(y - (x + a.length()-1)-1);//相当于y - (x + a.length())
        else
            System.out.println(-1);
    }
}

最长公共字符串后缀

给出若干个字符串,输出这些字符串的最长公共后缀。

输入格式
由若干组输入组成。

每组输入的第一行是一个整数 N。

N 为 0 时表示输入结束,否则后面会继续有 N 行输入,每行是一个字符串(字符串内不含空白符)。

每个字符串的长度不超过 200。

输出格式
共一行,为 N 个字符串的最长公共后缀(可能为空)。

数据范围
1≤N≤200
输入样例:
3
baba
aba
cba
2
aa
cc
2
aa
a
0
输出样例:
ba

a
建立字符串数组,对于每一组的n个数组值,我们for枚举后缀长度,要想判断所有字符串最后n字符是否都相同,只需要判断每个字符串是否与第一个字符串最后n字符是否都相等即可,故而我们for每个字符串,再for判断当前枚举的这个字符串的后n个数是否与第一个相同,如果不一样就缩小枚举直至都是null,此时也相同了hh

#include<iostream>
using namespace std;
const int N=210;
string str[N];
int n;
int main()
{
    while(cin>>n,n){
        int len=1000;
        for(int i=0;i<n;i++){
            cin>>str[i];
            if(len>str[i].size()){
                len=str[i].size();
            }
        }
        while(len){
            bool success=true;
            for(int i=0;i<n;i++){
                bool is_same=true;
                for(int j=1;j<=len;j++){
                    if(str[0][str[0].size()-j]!=str[i][str[i].size()-j]){
                        is_same=false;
                        break;
                    }
                }
                if(!is_same){
                    success=false;
                    break;
                }
            }
            if(success){
                break;
            }
            len--;
        }
        cout<<str[0].substr(str[0].size()-len)<<endl;
    }
    return 0;
}

如果是java:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            int n = sc.nextInt();
            if (n == 0) break;
            String[] strs = new String[n];//定义字符串数组
            for (int i = 0; i < n; i ++ )
                strs[i] = sc.next();

            StringBuilder res = new StringBuilder("");//字符串拼接使用,次实现初始化一个字符串为空
            for (int i = 0; i < strs[0].length(); i ++ ) {
                char c = strs[0].charAt(strs[0].length() - 1 - i);
                boolean flag = true;//看看当前的倒数第几个数是不是相同的
                for (int j = 1; j < n; j ++ ) {
                    if (i >= strs[j].length() || strs[j].charAt(strs[j].length() - 1 - i) != c) {
                        flag = false;
                        break;
                    }
                }
                if (flag) res.append(c);//是在前面加上如果结果为true的字符
                else break;
            }

            res.reverse();
            System.out.println(res);
        }
    }
}

打印数字

输入一个长度为 n 的数组 a 和一个整数 size,请你编写一个函数, void print(int a[], int size), 打印数组 a 中的前 size 个数。

输入格式
第一行包含两个整数 n 和 size。

第二行包含 n 个整数 a[i],表示整个数组。

输出格式
共一行,包含 size 个整数,表示数组的前 size 个数。

数据范围
1≤n≤1000,
1≤size≤n,

输入样例:
5 3
1 2 3 4 5
输出样例:
1 2 3
此题我们需要传入数组(如果要用函数的话)
比较简单,传入后按规定输出即可

#include<iostream>
using namespace std;
const int N=1001;
int a[N];
void print(int a[], int size){
    for(int i=0;i<size;i++){
        cout<<a[i]<<' ';
    }
}
int main()
{
    int n,size;
    cin>>n>>size;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    print(a,size);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想进步的22级本科生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值