`

0811-2 求最小前缀

阅读更多

给以文件,文件中每一行是一个单词,求出每个单词的最小前缀,使得该最小前缀能够代表这个单词。(当没有任何其他单词与之有共同的该前缀,该前缀就是最小前缀了。)

例如:

输入文件为:

cat

catt

cbtd

batty

abttyy

 

那么应该输出:

[前缀]   [单词]   

 cat      cat

 catt     catt

 cb       cbtd

 b        batty

 a        abttyy

 

 

 

编写代码时遇到了ConcurrentModificationException 异常,解决方法参考:http://61234865.iteye.com/category/98984?show_full=true

 

原理参考:

               http://www.iteye.com/topic/656670

               http://www.iteye.com/topic/164644

               http://www.iteye.com/topic/344876

               http://www.blogjava.net/houlinyan/archive/2008/04/01.html

               http://hi.baidu.com/latte88/blog/item/598b1e38d38366ced46225e1.html

 

 

 

这些原理看得很晕,现在只知道用ConcurrentHashMap代替HashMap可以解决该问题。

本文提供了代码下载,请高手用比较简单易懂的话告诉我原理吧。

 

package org.jyjiao;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.io.*;

public class StrPre {
	public void getPrefix(String path){
		ConcurrentHashMap<String,String> map=new ConcurrentHashMap<String,String>();
		//HashMap<String,String> map=new HashMap<String,String>(); //这样会抛出ConcurrentModificationException 异常
		try{
			BufferedReader br=new BufferedReader(new FileReader(path));
			String str;
			String value;
			String key;
			int tag=0;
		
			while((str=br.readLine())!=null){
				key=str.substring(0,1);
				if(map.containsKey(key)){
					value=map.get(key);
					value+="|"+str;
				}else{
					value=str;					
				}
				map.put(key,value);	
				
			}
		  int len=2;
		  int flag=0;
		
		  Iterator it=map.entrySet().iterator();
		  while(true){
		  	
		  	while(it.hasNext()){
		  		
		  		Map.Entry me=(Map.Entry)it.next();
		  		String mKey=(String)me.getKey();
		  		String mValue=(String)me.getValue();
		  		String[] varray=mValue.split("\\|");  // 第二个\用于对|转义,第一个\用于对第二个\转义
		  		String keypre,valuepre;
		  		if(varray.length>1 &&(flag==0||(flag==1&&mKey.length()<len))){
		  			tag=1;
		  			flag=1;
		  			for(int i=0;i<varray.length;i++){
		  				
		  				if(varray[i].length()>=len){
		  					key=varray[i].substring(0,len);
		  					keypre=varray[i].substring(0,len-1);
		  					if(map.containsKey(key)){
		  						value=map.get(key);
		  						value+="|"+varray[i];
		  					}else{
		  						value=varray[i];
		  					}
		  					map.put(key,value);
		  					
		  					if(map.containsKey(keypre)){
		  						valuepre=map.get(keypre);
		  						int index1=valuepre.indexOf(varray[i]);
		  						int index2=valuepre.indexOf("|",index1);
		  						
		  						String pre=valuepre.substring(0,index1);
		  						String post;
		  						if(index2==-1){
		  							post="";
		  						}else{
		  							post=valuepre.substring(index2+1);
		  						}
		  						valuepre=pre+post;
		  						map.put(keypre,valuepre);						
		  					
		  					}
		  					
		  				}
		  			}
		  			keypre=varray[0].substring(0,len-1);
		  			String strt=(String)map.get(keypre);
		  		
		  			if(strt.length()==0){
		  				it.remove(); //安全的删除操作
		  				//map.remove(keypre);//不推荐的删除操作
		  						  				
		  			}
		  		}
		  		
		  	}
		  	
		  	if(tag==0){
		  		break;
		  	}
		  	it=map.entrySet().iterator();
		  	tag=0;
		  	flag=0;
		  	len++;
		  }
		  
		//  System.out.println(map);
		  
		  Iterator ret=map.entrySet().iterator();
		  while(ret.hasNext()){
		  		Map.Entry me1=(Map.Entry)ret.next();
		  		System.out.println(me1.getKey()+"    "+me1.getValue());
		  }
		  br.close();
		}catch(Exception ex){
			ex.printStackTrace();
		}
	}

	public static void main(String[] args) {
		StrPre strpre = new StrPre();
		strpre.getPrefix("C:/jtest/8/0811/word.txt");

	}
}

  

 

 

 

分享到:
评论

相关推荐

    php-leetcode题解之实现前缀树.zip

    在解决LeetCode上的前缀树问题时,你可能会遇到各种变体,如查找所有以特定前缀开头的单词、统计特定模式的出现次数,或者构建最小覆盖前缀树等。这些题目将测试你对前缀树的理解以及使用PHP解决问题的能力。 通过...

    vb 完全自学

    根据提供的文件信息,我们可以从中提炼出关于VisualBasic(VB)编程的知识点,包括命名约定、代码规范以及部分控件和数据库对象的命名前缀。以下是对这些知识点的详细说明: 1. 命名约定的目的和重要性 命名约定的...

    常见数据结构与算法C语言实现

    # 常见数据结构与算法C语言实现 内容包含常见基本数据结构实现(C语言版)如各自排序、链表、栈、队列、各种树以及应用、图算法、字符串匹配算法、回溯、并查集等 ...- 前缀中缀求后缀 - 哈密顿环

    DFA.rar_活前缀dfa_活前缀的DFA

    2. **构造状态**:每个状态代表文法中的一个特定信息,例如当前识别到的活前缀。初始状态通常对应空字符串,而每个后续状态表示添加了一个或多个字符后的活前缀。 3. **确定转移**:基于文法规则,我们需要定义状态...

    最小和数组(控制间距,前缀求和找最小)1

    2. 动态规划思想:通过计算前缀和数组,可以避免重复计算,降低时间复杂度。 3. 双指针法:在这里,指针 i 和 j 分别代表子数组的起始和结束,通过调整它们的位置来遍历不同长度的子数组。 4. 最大值和最小值的查找...

    编译原理 活前缀 程序

    计算活前缀通常与构造正规表达式的最小确定有限自动机(DFA)相关。当给定一组产生式和起始符号时,可以通过以下步骤计算活前缀: 1. **构造闭包集:** 对于每个产生式,计算其所有可能的非终结符序列,形成闭包集...

    数据结构-表达式求值

    1. 前缀表达式(Prefix Expression):运算符在操作数之前,如 `+ * a b * - c / d e f` 2. 中缀表达式(Infix Expression):运算符在操作数之间,如 `a * b + c - d / e * f` 3. 后缀表达式(Postfix Expression)...

    system:此存储库已弃用,它被以“dotfiles-xxx”为前缀的存储库替换

    我的系统配置文件buildvim:从源存储库构建 VIM 目录.bash_functions .bash_profile .bashrc .dircolors:Bash Shell 配置.gtkrc-2.0 .gtkrc-solarized:最小的 GTK 主题.vimrc .vim/: VIM 插件和设置.Xdefaults:...

    前缀和详解01.zip

    2. **区间查询**:已知前缀和,可以迅速求出任意子区间[A[i], A[j]](i )的和,只需S[j] - S[i-1]即可。 3. **差分操作**:若数组B[i] = A[i+1] - A[i],则B的前缀和可以用于求解原数组A的某些问题,例如求解连续子...

    字符串处理- 最大最小表示法.rar

    7. **扩展应用**:最大最小表示法还可以与其他数据结构结合,如前缀树(Trie)、后缀数组等,以增强其功能和性能。例如,与Trie结合可以实现高效的字符串查找和模式匹配。 8. **优化**:为了进一步提高性能,可以...

    html-sass-jumpstart:最小的SassHTML模板网站-dart sass技术支持,包括stylelint和pettitier,并在构建时自动添加前缀。 开发脚本包括通过浏览器同步热重载

    包括最小主题和组件加载项目后,请查看Github页上 ,以及index.html文件。入门选择“使用此模板”以将该项目复制到您自己的新仓库中。 可选:运行查找/替换tdbc以更新到您的首选前缀(或调整stylelint设置)。 您...

    IPv6.rar

    三、加上前缀--FE80::0250:3EFF:FEE4:4C00 这就是一个完整的IPV6地址 反转的原因:  在MAC地址中,第7比特为1表示本地管理,为0表示全球管理  在EUI-64格式中,第7位为1表示全球惟一,为0表示本地惟一 组播地址...

    cpp-ParTcl一个最小的Tcl解释器

    1. **命令和变量**:在Tcl中,命令以空格分隔,变量名前缀为 `$`。例如,`set x 10` 声明了一个名为 `x` 的变量并赋值为 `10`。 2. **字符串操作**:Tcl字符串可以用双引号 `""` 或反斜杠 `\` 转义字符。例如,`puts...

    前缀和详解22.zip

    例如,对于数组`arr = [1, 2, 3, 4]`,其前缀和数组为`preSum = [1, 3, 6, 10]`。 前缀和的主要优势在于可以快速求解区间和。假设我们想要查询数组`arr`从索引`l`到`r`的和,只需要用`preSum[r]`减去`preSum[l-1]`...

    前缀和详解21.zip

    2. **求子数组最大/最小值**:通过两次遍历数组,一次计算前缀和,一次计算后缀和,可以找到数组中的最大连续子数组和或最小连续子数组和,如Kadane's algorithm。 3. **异或操作**:数组元素的异或运算也满足前缀和...

    程序设计C,C++哥德巴赫猜想,食物链,狼群战术,列车长的烦恼,最小生成树,凯撒密码,远古文明的算术,非前缀码,动态生成最小二叉排序树,小明数学题,成对字符串,唯一生成最小二叉树

    8. **非前缀码**:在信息论中,非前缀码是一种编码方式,确保没有一个码字是另一个码字的前缀。在数据压缩和通信中,非前缀码能避免编码解析的歧义。 9. **动态生成最小二叉排序树**:二叉排序树是一种特殊的二叉树...

    常用算法代码常用算法代码常用算法代码

    - PRIM求最小生成树(MST):用于找出加权无向图的最小生成树。 - 次小生成树:找出加权无向图的第二小的生成树。 - 最小生成森林问题:处理图中有K颗树时的最小生成问题。 - 有向图最小树形图:求解给定有向图的最小...

    css-prefixes:映射公共前缀的子集

    2. **避免过度依赖**:虽然前缀可以帮助解决兼容性问题,但应尽量减少对它们的依赖,因为随着时间推移,某些前缀可能会被淘汰。例如,Opera(`-o-`)已经不再使用其私有前缀。 3. **自动化的工具**:利用像...

    最小m段和问题-C语言

    最后,dp[n][m]即为所求的结果,表示将整个序列分割成m段时,子序列和的最大值最小是多少。 以下是一段C语言实现的测试代码: ```c #include #define N 100 int n, m; int a[N], sum[N]; int dp[N][N]; int ...

    【江苏海洋大学数据结构22-23-2】

    以上就是江苏海洋大学22-23-2学期数据结构课程中涉及的关键知识点,涵盖了树的遍历、赫夫曼编码、哈希表、图的最小生成树以及网络计划问题。通过这些练习,学生能够深入理解数据结构的核心概念,并具备解决实际问题...

Global site tag (gtag.js) - Google Analytics