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字符串

Java实现字符串的包含的更多相关文章

  1. Java检查字符串是否包含中文字符

    转自:https://blog.csdn.net/zhanghan18333611647/article/details/80038629 强烈推荐一个大神的人工智能的教程:http://www.ca ...

  2. Java 判断字符串是否包含某个字符

    // 判断不为静态栏目的文章 if (e.getCategory().getName().indexOf("静态") == -1) { articleList2.add(e); } ...

  3. Java split字符串中包含.的情况

    "a.b".split(".")的语句会返回[],必须进行转义, "a.b".split("\\.")

  4. java 验证字符串是否包含中文字符

    中文的模式:"[\\u4e00-\\u9fa5]|\\\\u" 例子: private static final Pattern p = Pattern.compile(" ...

  5. Java判断字符串是否包含数字

    public static boolean isContainNumber(String company) { Pattern p = Pattern.compile("[0-9]" ...

  6. java 判断字符串中是否包含中文并过滤掉中文

      java判断字符串中是否包含中文并过滤掉中文 CreateTime--2017年9月6日08:48:59 Author:Marydon 1.判断字符串中是否包含中文方法封装 /** * 判断字符串 ...

  7. Java:判断字符串中包含某字符的个数

    Java:判断字符串中包含某字符的个数 JAVA中查询一个词在内容中出现的次数: public int getCount(String str,String key){ if(str == null ...

  8. 算法笔记_024:字符串的包含(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力轮询法 2.2 素数相乘法 2.3 位运算法 1 问题描述 给定一长字符串A和一短字符串B.请问,如何最快地判断出短字符串B中的所有字符是否都在长字符串A ...

  9. java中如何判断一个字符串是否包含另外一个字符串的方法

    indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...

随机推荐

  1. [hdu4292]最大流,拆点

    题意:给定每个人所喜欢的食物和饮料种类以及每种食物和饮料的数量,一个人需要一种食物和一种饮料(数量为1即可),问最多满足多少人的需要 思路:由于食物和饮料对于人来说需要同时满足,它们是“与”的关系,所 ...

  2. [hdu5323]复杂度计算,dfs

    题意:求最小的线段树的右端点(根节点表示区间[0,n]),使得给定的区间[L,R]是线段树的某个节点. 数据范围:L,R<=1e9,L/(R-L+1)<=2015 思路:首先从答案出发来判 ...

  3. 【数论基础】素数判定和Miller Rabin算法

    判断正整数p是否是素数 方法一 朴素的判定   

  4. spark机器学习从0到1主成分分析-PCA (八)

      PCA 一.概念 主成分分析(Principal Component Analysis)是指将多个变量通过线性变换以选出较少数重要变量的一种多元统计分析方法,又称为主成分分析.在实际应用场合中,为 ...

  5. node的url模块

    .parse(url,query2obj[boolean],ignorePrototype[boolean]) .format({}) 和.parse相反,将带有url参数属性的对象组装成url .r ...

  6. Angular路由知识点

    路由跳转 1. 模板方式:<ANY  routerLink='/ucenter'></ANY> 2. 脚本方式:  constructor(private router:Rou ...

  7. C# 操作Orcle数据库

    1.首先添加NuGet:Oracle.ManagedDataAccess 2.配置连接数据库字符串:Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(H ...

  8. Redis 消息中间件 ServiceStack.Redis 轻量级

    问题: 公司开了个新项目,算上我一共3个人.车间里机台通过流水线连通联动的玩意.一个管理控制系统连接各个机台和硬件.专机类型就有5种,个数差不多20个左右. 软件规划的时候采用总分的结构,管理控制系统 ...

  9. 【Java8新特性】关于Java8的Stream API,看这一篇就够了!!

    写在前面 Java8中有两大最为重要的改变.第一个是 Lambda 表达式:另外一个则是 Stream API(java.util.stream.*) ,那什么是Stream API呢?Java8中的 ...

  10. POJ1984

    题目链接:https://vjudge.net/problem/POJ-1984 解题思路:并查集+离线操作. 用dx[ ]和dy[ ]两个数组存储某点相对于该点所在集合的源头的方位,因此不难推知dx ...