【查找】同构词是指两个词语中,相同的位置出现相同的词,“ABB“与“兴冲冲“是同构词。编写程序,对输入的两个字符串,求最长的同构前缀(前面最长有多少个是同构子串)的串长。(java)

同构词是指两个词语中,相同的位置出现相同的词,"ABB"与"兴冲冲"是同构词。“abcda”与“我欺骗了我”是同构词,而"aba"与"666"不是同构词。 如果字符串s中的字符可以按某种映射关系替换得到字符串t ,那么这两个字符串是同构字符串。编写程序,对输入的两个字符串,求最长的同构前缀(前面最长有多少个是同构子串)的串长。

注意:1)每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。2)请尽量将时间复杂度控制在O(N)以内。

输入格式:

两行,每一行一个字符串,长度在1000以内,以回车表示结束。

输出格式:

输出一个整数,表示两个串构成同构词的最大前缀(前边最多有多少个字符的子串是同构的)。

输入样例1:

ABB ACDE
899 8767

输出样例1:

本输入样例中,第一个串:前四个两两相同(中间重复),后三个均不相同,第二个串前四个也两两相同(中间重复),但后三个有两个相同: 'A'->'8','B'->'9',' '->' ','C'->'7','D'->'6',但‘E’不能再对应‘7’。最长同构子串是前7个。

7

输入样例2:

*/paper_889
+-title_6667

输出样例2:

本输入样例中,第一个串:前四个两两相同(中间重复),后三个均不相同,第二个串前四个也两两相同(中间重复),但后三个有两个相同: 'A'->'8','B'->'9',' '->' ','C'->'7','D'->'6',但‘E’不能再对应‘7’。最长同构子串是前7个。

10

代码如下: 

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        char[] str1 = input.nextLine().toCharArray();
        char[] str2 = input.nextLine().toCharArray();
        char[] map1 = new char[65535];
        char[] map2 = new char[65535];
        int len = Math.min(str1.length,str2.length);
        int i;
        for(i = 0;i < len;i++){
            char a = str1[i];
            char b = str2[i];
            if(map1[a] == 0 && map2[b] == 0){
                map1[a]=b;
                map2[b]=a;
            } else if (map1[a]!=0 && map1[a]!=b || map2[b]!=0 && map2[b]!=a){
                break;
            }
        }
        System.out.print(i);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天的命名词

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

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

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

打赏作者

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

抵扣说明:

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

余额充值