两道字符串的水题

acm3080 acm1936

一个是求两个串的最长公共序列,一个是两个串的匹配

package com.woxiaoe.acm.pku.P1936;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;


public class Main {
	
	public static void main(String[] args) {
		Scanner scn = new Scanner(Main.class.getResourceAsStream("in.dat"));
		//Scanner scn = new Scanner(System.in);
		PrintWriter out = new PrintWriter(System.out);
		List<String> data = new ArrayList<String>();
		while(scn.hasNext()){
			data.add(scn.next());
			
		}
		int len = data.size();
		String src = "";
		String desc = "";
		int r = 0;
		int cLen = 0;
		for(int i = 0; i < len; i++){
			int pre = -1;
			Set<Integer> vSet = new HashSet<Integer>();
			src = data.get(i);
			desc = data.get(++i);
			char[] c = src.toCharArray();
			cLen = c.length;
			for(int j = 0; j < cLen; j++){
				r = desc.indexOf((int)c[j]);
				while((vSet.contains(r) || r < pre) && r != -1){
					r = desc.indexOf((int)c[j],r + 1);
				}
				if(r != -1 && r > pre ){
					vSet.add(r);
					pre = r;
				}else{
					out.println("No");
					r = -1;
					break;
				}
			}
			if(r != -1){
				out.println("Yes");
			}
			r = 0;
		}
		out.flush();
	}

}
  package com.woxiaoe.acm.poj3080;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
	
	public static void main(String[] args) throws IOException {
		Scanner scn = new Scanner(Main.class.getResourceAsStream("in.dat"));
		//Scanner scn = new Scanner(System.in);
		int n,m = 0;
		List<String> data = null;;
		while(true){
			n = scn.nextInt();
			for(int i = 0; i < n; i++){
				data = new ArrayList<String>();
				m = scn.nextInt();
				for(int j = 0; j < m; j++){
					data.add(scn.next());
				}
				System.out.println(work(data,data.size()));
			}
			return;
			
		}
		
	}

	private static String work(List<String> data, int m) {
		String str = data.get(0);
		int len = str.length();
		String sub = "";
		String common = "";
		int size = 0;
		boolean find = false;
		for(int i = 0; i < len - 1; i++){
			for(int j = i; j < len; j++){
				sub = str.substring(i,j + 1);
				int k = 0;
				for(k = 1; k < m; k++){
					if(data.get(k).indexOf(sub) == -1){
						find = false;
						break;
					}
				}
				if(k == m){
					find = true;
				}
				if(find){//如果找到
					if(sub.length() < 3){
						continue;
					}
					if(sub.length() == size && common.compareTo(sub) > 0){
						common = sub;
					}else if(sub.length() > size){
						size = sub.length();
						common = sub;
					}
					
				}
			}
		}
		
		return size == 0?"no significant commonalities":common;
	}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值