Java 字符串包含_实现字符串的复制

Java 字符串包含_实现字符串的复制1问题描述给定一长字符串A和一短字符串B。请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A中?请编写一个判断函数实现此功能。为简单起见,假设输入的字符串只包含小写英文字母。下面举几个例子。(1)如果字符串A是”abcd”,字符串B是”bad”,答案是包含,因为字符串B中的字母都在字符串A中,或者说B是A的真子集。(2)如果字符串A是”abcd”,字符串B是”bce”,答案是…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1 问题描述
给定一长字符串A和一短字符串B。请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A中?请编写一个判断函数实现此功能。

为简单起见,假设输入的字符串只包含小写英文字母。下面举几个例子。

(1)如果字符串A是”abcd”,字符串B是”bad”,答案是包含,因为字符串B中的字母都在字符串A中,或者说B是A的真子集。

(2)如果字符串A是”abcd”,字符串B是”bce”,答案是不包含,因为字符串B中的字母e不在字符串A中。

(3)如果字符串A是”abcd”,字符串B是”aab”,答案是包含,因为字符串B中的字母a包含在字符串A中。

2 解决方案
2.1 蛮力轮询法

判断字符串B中的字符是否都在长字符串A中,最直观的思路则是:轮询B中每一个字符,逐个与A中每个字符进行比较,看是否都在字符串A中。

具体代码如下:

package com.liuzhen.string_1;

public class StringContain {
    //方法1:蛮力轮询
    /*
     * 参数A:给定的长字符串A
     * 参数B:给定的短字符串B
     * 函数功能:如果B中所有字符在A中均出现过,则返回true,否则返回false
     */
    public boolean bruteContain(String A,String B){
        boolean result = false;
        char[] arrayA = A.toCharArray();
        char[] arrayB = B.toCharArray();
        int testLen = 0;            //用于计算B中与A匹配字符个数
        for(int i = 0;i < arrayB.length;i++){
            for(int j = 0;j < arrayA.length;j++){
                if(arrayB[i] == arrayA[j]){
                    testLen++;
                    break;
                }
            }
        }
        if(testLen == arrayB.length)        //当B个所有字符均和A中字符匹配时
            result = true;
        return result;
    }
    
    
    public static void main(String[] args){
        StringContain test = new StringContain();
        String A = "abcd";
        String B = "aab";
        if(test.bruteContain(A, B))
            System.out.println("使用蛮力轮询法得到结果:A字符串包含B字符串");
        else
            System.out.println("使用蛮力轮询法得到结果:A字符串不包含B字符串");
    }
}

运行结果:

使用蛮力轮询法得到结果:A字符串包含B字符串

2.2 素数相乘法
思路如下:

(1)按照从小到大的顺序,用26个素数分别代替长字符串A中的所有字母。

(2)遍历字符串A,求得A中所有字母对于的素数的乘积。

(3)遍历短字符串B,判断上一步得到的乘积能否被B中的字母对于的素数整除。

(4)输出结果。

package com.liuzhen.string_1;

public class StringContain {
    
    //方法2:素数相乘
    /*
     * 参数A:给定的长字符串A
     * 参数B:给定的短字符串B
     * 函数功能:如果B中所有单个字符对应素数能被A中所有字符对应素数之积整除,则返回true,否则返回false
     */
    public boolean primeContain(String A,String B){
        boolean result = true;
        int[] primes = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
        long mulSum = 1;
        char[] arrayA = A.toCharArray();
        char[] arrayB = B.toCharArray();
        for(int i = 0;i < arrayA.length;i++)
            mulSum *= primes[arrayA[i] - 'a'];
        for(int j = 0;j < arrayB.length;j++){
            int temp = (int) (mulSum % primes[arrayB[j] - 'a']);
            if(temp != 0){               //此时,A中不包含arrayB[j]字符
                result = false;
                return result;
            }
        }
        return result;
    }
    
    
    public static void main(String[] args){
        StringContain test = new StringContain();
        String A = "abcd";
        String B = "aab";
        if(test.placeContain(A, B))
            System.out.println("使用素数相乘法得到结果:A字符串包含B字符串");
        else
            System.out.println("使用素数相乘法得到结果:A字符串不包含B字符串");
    }
}

运行结果:

使用素数相乘法得到结果:A字符串包含B字符串

2.3 位运算法

用位运算(26位整数表示)为长字符串A计算出一个“签名”(利用位或运算),再逐一将短字符串B中的字符放到A中进行查找(PS:利用位与运算)。

package com.liuzhen.string_1;

public class StringContain {
    
    //方法3:位运算法
    /*
     * 参数A:给定的长字符串A
     * 参数B:给定的短字符串B
     * 函数功能:如果B中每个字符进行处理后的对应二进制值与A中所有字符进行处理对应二进制值的求或运算
     * ,在单独进行求与运算,一旦出现0,则返回false,否则返回true
     */
    public boolean placeContain(String A,String B){
        boolean result = true;
        char[] arrayA = A.toCharArray();
        char[] arrayB = B.toCharArray();
        int hash = 0;
        for(int i = 0;i < arrayA.length;i++)
            hash |= (1 << (arrayA[i] - 'a'));   //|=意思是位或运行,即将hash的二进制与|=后数字进行或运算结果赋值给hash
        for(int j = 0;j < arrayB.length;j++){
            if((hash & (1 << (arrayB[j] - 'a'))) == 0){      //进行与运算,即当A中不包含arrayB[j]字符时
                result = false;
                return result;
            }
        }
        return result;
    }
    
    public static void main(String[] args){
        StringContain test = new StringContain();
        String A = "abcd";
        String B = "aab";  
        if(test.placeContain(A, B))
            System.out.println("使用位运算法得到结果:A字符串包含B字符串");
        else
            System.out.println("使用位运算法得到结果:A字符串不包含B字符串");   
    }
}

运行结果:

使用位运算法得到结果:A字符串包含B字符串
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184276.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 协同过滤推荐算法介绍(协同过滤的推荐算法)

    随着电商企业的发展,为了更好的了解用户喜好以便于将更加适合的商品推荐给用户,不仅能得到用户好的评价,而且也有利于自身企业的利益,因此,随之诞生了很多推荐系统,最为常用的推荐算法就是协同过滤算法。转载请标明原文链接推荐算法的基础就是基于两个对象之间的相关性,常用的计算方法有欧几里得相似性,这是一种使用较多的相似性计算方法。除此之外还有曼哈顿相似性和余弦相似性的计算方法。协同过滤算…

    2022年4月10日
    47
  • 树莓派3b入门指南「建议收藏」

    树莓派3b入门指南「建议收藏」近日,入手了树莓派3b,准备把它当一台防火墙用,配置如下:我买的套装是最简版的,只有一个电源线、一个塑料外壳,一个8GSD卡,几个散热片。捣鼓了几天,网上搜索了一些资料,在此记录下详细的过程,方便之后入手的朋友。一.烧写树莓派镜像(需要一个SD卡读写器)1.进入官网https://www.raspberrypi.org/downloads/下载页面,选择“RASP…

    2022年6月25日
    54
  • CefSharp中文帮助文档「建议收藏」

    CefSharp中文帮助文档「建议收藏」CefSharp是围绕Chromium嵌入式框架(ChromiumEmbeddedFramework,CEF)的简单.Net包装器。CEF是一个基于GoogleChromium项目的开源项目。与Chromium项目本身(主要专注于GoogleChrome应用程序开发)不同,CEF专注于促进第三方应用程序中的嵌入式浏览器用例。CEF基于多进程ChromiumContentAPI,因此,当前仅存在Chromium的部分功能。例如,对扩展的支持是有限的,仅实现了一部分ExtensionAPI。..

    2026年1月27日
    5
  • 计算机二级选择题——数据结构与算法[通俗易懂]

    计算机二级选择题——数据结构与算法[通俗易懂]按照自己的理解写的解题思路,如有错误希望指正。1.算法的复杂度: ①时间复杂度:执行算法所需的计算工作量(又叫:基本运算次数) ②空间复杂度:执行算法所需的内存 它们是没有任何关系的!!!2.求二叉树序列类题目 要点:前序—根左右 中序—左根右 后序—左右根 例1:已知前序ABCDE,中序BCADE,求后序;同类型,已知任意两个求第三个 解题思路: 由前序知道A是根,结合中序,CB是左子树,DE…

    2022年8月18日
    9
  • JAVA中parameterized,java使用ParameterizedType实现泛型

    JAVA中parameterized,java使用ParameterizedType实现泛型1 过程 1 测试属性类型 2 打印 type 与 generictype 的区别 3 测试参数类型 4 测试返回值类型 2 实例 publicclassC privateMapob publicvoidte Mapmap Stringstring publicMaptes returnnull 测试属性类型 throws

    2025年8月19日
    5
  • CSS面试题

    CSS面试题1.有哪些方式(CSS)可以隐藏页面元素?1.opacity:0本质是将元素的透明度降为0,看起来是隐藏了,但是依然占据空间2.visibility:hidden占据空间3.display:none彻底隐藏元素,元素从文档流中消失,不占据空间4.z-index:-9999原理是将层级放到底部,看起来是隐藏了5.overflow:hidden这个只是隐藏元素溢出的部分6.transform:scale(0,0)将元素缩放为0,但是依然占据空间2.em\px\rem区别?Px:绝对

    2022年5月31日
    45

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号