我们规定对一个字符串的shift操作如下:

本文介绍了一种通过循环左移字符串并统计重复模式出现次数的方法。利用HashMap记录每种可能的字符串移位形式及其出现频率,最终找出最高频率作为匹配次数。

shift(“ABCD”,0)=”ABCD”
shift(“ABCD”,1)=”DABC”
shift(“ABCD”,2)=”CDAB”
换言之,我们把最左侧的N个字符剪切下来,按序附加到了右侧。
给定一个长为n的字符串,我们规定最多可以进行n次向左的循环shift操作。如果
shift(string,x)=string(0<=x< n),
我们称其为一次匹配(match)。求在shift过程中出现匹配的次数。


好了,题目叙述完毕

解题思路:
这里用了简单粗暴的方法,定义一个交换函数,进行按题所示的’shift’操作,把所有的结果记录在HashMap中,对应的value记录的是该字符串出现的次数,并在ArrayList中也记录一次,用于在最后的在Map中查找出现次数的依据。
代码如下:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;


public class Main {

    public static void main(String[] args) {
        Main ss=new Main();
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入字符串:");
        String s=sc.nextLine();//从键盘读取要处理的字符串
        int max=0;//匹配次数
        HashMap<String,Integer>hm=new HashMap<String,Integer>();
        ArrayList<String>list=new ArrayList<String>();
        for(int i=0;i<s.length();i++)
        {
            String temp=ss.swap(s, i);
            if(hm.containsKey(temp)){//如果map中已经包含该单词,则将其个数+1
                 int x = hm.get(temp);
                 x++;
                 hm.put(temp, x);
             }else{  //如果map中没用包含该单词,代表该单词第一次出现,则将其放入map并将个数设置为1
                 hm.put(temp, 1);
                 list.add(temp);
             }

        }
        for(String xx:list)//对字符串所有可能出现的左移效果进行遍历,记录最大匹配次数
        {
            int i=hm.get(xx);
            if(i>max)
                max=i;

        }

        System.out.println(max);
        sc.close();//关闭流

    }



    public String swap(String str,int num)//把一个字符串按题目要求左移并返回
    {

        String s1=str.substring(num, str.length());
        StringBuffer result=new StringBuffer(s1);
        result.append(str.substring(0, num));
        return result.toString();
    }
}

按照题示,输入byebyebye,输出3
这里写图片描述

本关任务:编写一个程序实现凯撒加密。 相关知识 为了完成本关任务,你需要掌握:1.string库,2.maketrans() 函数,3.translate()函数。 String 模块 要使用string模块,我们需要先导入: import string 下面介绍几个string的内置属性: string.ascii_uppercase 所有大写字母 string.ascii_lowercase 所有小写字母 string.ascii_letters 所有字母 string.digits 所有数字 示例如下: import string lower = string.ascii_lowercase upper = string.ascii_uppercase digit = string.digits before = string.ascii_letters 输出: abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789 abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ maketrans() 和 translate() 由于两个函数要结合使用,所以就一起介绍了。 maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 注:两个字符串的长度必须相同,为一 一对应的关系。 maketrans()方法语法: str.maketrans(intab, outtab) 参数 intab -- 字符串中要替代的字符组成的字符串。 outtab -- 相应的映射字符的字符串。 返回值 返回字符串转换后生成的新字符串。 translate() 方法根据参数table给出的表(包含 256 个字符)转换字符串的字符, 要过滤掉的字符放到 del 参数中。 translate()方法语法: str.translate(table[, deletechars]) 参数 table -- 翻译表,翻译表是通过maketrans方法转换而来。 deletechars -- 字符串中要过滤的字符列表。 返回值 返回翻译后的字符串。 示例如下: 示例一: intab = "aeiou" # 原字符 outtab = "12345" # 用于替换的字符 # 想要加密的字符串的明文 txt = "this is string example....wow!!!" # 创建映射转换表 # 将明文中字符"a、e、i、o、u"分别替换为"1、2、3、4、5",其他字符不变 trantab = ''.maketrans(intab, outtab) # 输出加密后的结果 print(txt.translate(trantab)) 输出: th3s 3s str3ng 2x1mpl2....w4w!!! 示例二: intab = "abcdefghijklmnopqrstuvwxyz" # 原字符 outtab = "defghijklmnopqrstuvwxyzabc" # 用于替换的字符 # 想要加密的字符串的明文 txt = "this is string example....wow!!!" # 创建映射转换表,用后面第3个字符替换 trantab = ''.maketrans(intab, outtab) # 输出加密后的结果 print(txt.translate(trantab)) 输出: wklv lv vwulqj hadpsoh....zrz!!! 输入输出格式 输入格式 输入为一行,是一个字符串。 输出格式 输出为一行,对输入的字符串进行加密后的字符串。 编程要求 根据提示,在右侧编辑器补充代码,实现凯撒加密:输入一个字符串,对字符串中的字母和数字进行加密(规定加密偏移量为3,即后移三位),并输出加密后的字符串。 测试说明 平台会对你编写的代码进行测试: 测试输入:Open Box PassWord:2021 预期输出:Rshq Era SdvvZrug:5354 给出完整代码
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值