5个方法解决字符串包含关系

最近看了《编程之法:面试和算法心得》这本书,被各种高深的算法给膜拜了(本人职场小白,开发经验有限,抱着一颗学习的心,向大神学习),在这里整理了书中的部分算法,主要有两个目的:

1、做记录,为了以后使用方便查询。

2、分享学习,发表博客分享好东西,大家相互学习,有什么错误的地方,也请各位大神指教!

本文章是以《编程之法:面试和算法心得》书籍作为基础,将书籍中的算法使用java语言进行整理,以及个人所列举的计算方法,本文章根据本书中的第二节字符串的包含进行整理,并且提出了本人平时使用的计算方法(本人方法卓略,大神勿喷),以供日后查阅,及分享!

以下为个人根据书籍整理的算法,以java语言编程,代码如下:

package bianchengzhifaExample;

import java.util.ArrayList;
import java.util.List;

import com.google.common.collect.Ordering;

public class StringIsContain {
	
	/**
	 * 轮询
	 * @param a
	 * @param b
	 * @return
	 */
	public boolean strIsContain1(String a,String b){
		for (int i = 0; i < b.length(); i++) {
			int j;
			for (j = 0; (j < a.length()) && (a.charAt(j)!=b.charAt(i)); j++); 
			if(j>= a.length()){
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 先排序后轮询,降低空间复杂度
	 * @param a
	 * @param b
	 * @return
	 */
	public boolean strIsContain2(String a,String b){
		a=sortStr(a);
		System.err.println("a:"+a);
		b=sortStr(b);
		System.err.println("b:"+b);
		for (int pa = 0,pb=0; pb < b.length(); ) {
			while ((pa<a.length())&&(a.charAt(pa)<b.charAt(pb))) {
				++pa;
			}
			if((pa>=a.length())||(a.charAt(pa)>b.charAt(pb))){
				return false;
			}
			++pb;
		}
		return true;
		
	}
	
	/**
	 * 利用List  Contains方法
	 * @param a
	 * @param b
	 * @return
	 */
	public boolean strIsContain3(String a,String b){
		List<String> s=new ArrayList<String>();
		for (int i = 0; i < a.length(); i++) {
			String str = String.valueOf(a.charAt(i));
			s.add(str);
		}
		for (int i = 0; i < b.length(); i++) {
			String str = String.valueOf(b.charAt(i));
			if(!s.contains(str)){
				return false;
			}
		}
		return true;
	}
    
	/**
	 * 利用素数(缺陷,前16个素数相乘已经超过long的最大范围,因此该方法的使用范围必须在16个不同字母以内)
	 * @param a
	 * @param b
	 * @return
	 */
	public boolean strIsContain4(String a,String b){
		long p[]={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 f=1;
		for (int i = 0; i < a.length(); i++) {
			long x=p[a.charAt(i)-'A'];
			if(f % x!=0){
				f*=x;
			}
		}
		System.err.println("f:"+f);
		for (int i = 0; i < b.length(); i++) {
			long x=p[b.charAt(i)-'A'];
			if(f % x!=0){
				return false;
			}
		}
		
		return true;
	}
	
	/**
	 * 通过位移判断(根据不同的偏移量来确定是否包含字符)
	 * @param a
	 * @param b
	 * @return
	 */
	public boolean strIsContain5(String a,String b){
		int hash=0;
		for (int i = 0; i < a.length(); i++) {
			hash|=(1<<(a.charAt(i)-'A'));
			System.err.println("hash"+i+":"+hash);
		}
		for (int i = 0; i < b.length(); i++) {
			if((hash & (1<<(b.charAt(i)-'A')))==0){
				return false;
			}
		}
		return true;
	}
	
	
	private String sortStr(String str){
		List<String> s=new ArrayList<String>();
		for (int i = 0; i < str.length(); i++) {
			String string = String.valueOf(str.charAt(i));
			s.add(string);
		}
		Ordering<String> ordering = Ordering.natural();
		List<String> scoreOrdering = ordering.sortedCopy(s);
		String st="";
		for (String string : scoreOrdering) {
			st+=string;
		}
		return st;
	}
	
	public static void main(String[] args) {
		String a="QWERTYUIOPASDFGHJKLZXCVBNM";
		String b="ASDFGH";
		StringIsContain sic=new StringIsContain();
		System.err.println(sic.strIsContain1(a, b));
		System.err.println(sic.strIsContain2(a, b));
		System.err.println(sic.strIsContain3(a, b));
		System.err.println(sic.strIsContain4(a, b));
		System.err.println(sic.strIsContain5(a, b));

	}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值