javaee论坛

普通会员

225648

帖子

344

回复

358

积分

楼主
发表于 2019-11-03 15:42:21 | 查看: 322 | 回复: 3

对于某些字符串S,我们将执行一些替换操作,用新的字母组替换原有的字母组(不一定大小相同)。每个替换操作具有3个参数:起始索引i,源字x和目标字y。规则是如果x从原始字符串S中的位置i开始,那么我们将用y替换出现的x。如果没有,我们什么都不做。

示例输入:S="abcd",indexes=[0,2],sources=["a","cd"],targets=["eee","ffff"]输出:"eeebffff"解释:"a"从S中的索引0开始,所以它被替换为"eee"。"cd"从S中的索引2开始,所以它被替换为"ffff"提示0<=indexes.length=sources.length=targets.length<=1000<indexes[i]<S.length<=1000给定输入中的所有字符都是小写字母解题思路解法一

先找出需要替换的索引replace_indexs,然后对replace_indexs进行排序,为什么需要排序呢?因为替换值和被替换值的长度不一样,这样就产生了偏移量offset,因为原indexes是无序的,偏移量影响的地方不确定,当对replace_indexs排序后,偏移量只会对后面的需要替换的字符串造成影响,在字符串截取或者替换的时候,开始坐标就变成了index+offset。

解法二

将原字符串转换成char数组,每个下标对应一个标记是否需要字符串替换。遍历整个char数组,将每个值添加到新的字符串中,如果需要替换,添加的值为替换值,下标变换等于原下标+被替换字符串的长度。如果不需要替换,添加值为char数组对应下标的值,下标前移一位。

代码实现方法一/***将需要替换的索引排序,因为替换的值和被替换值得长度不一样,所以在字符串截取的时候会产生偏移量,将需要替换的索引排序后,偏移量只会对后面需要替换的字符串产生影响**@paramS*@paramindexes*@paramsources*@paramtargets*@return*/publicstaticStringfindReplaceStringByOrderIndex(StringS,int[]indexes,String[]sources,String[]targets){StringBuildersb=newStringBuilder(S);//new一个具有排序功能的TreeMapMap<Integer,Integer>map=newTreeMap<Integer,Integer>(newComparator<Integer>(){@Overridepublicintcompare(Integero1,Integero2){returno1.compareTo(o2);}});//查找出需要替换的字符串存入map,key为需要替换字符串的下标,value为原数组下标for(inti=0;i<indexes.length;i++){intindex=indexes[i];Stringsource=sources[i];//判断是否需要替换if(S.substring(index).startsWith(source)){map.put(index,i);}}//偏移量intoffset=0;for(Integerkey:map.keySet()){Integervalue=map.get(key);Stringsource=sources[value];Stringtarget=targets[value];sb.replace(key+offset,key+offset+source.length(),target);offset+=target.length()-source.length();}returnsb.toString();}方法二/***将字符串转变成char数组,逐个添加到新字符串中*@paramS*@paramindexes*@paramsources*@paramtargets*@return*/publicstaticStringfindReplaceStringByCharAt(StringS,int[]indexes,String[]sources,String[]targets){StringBuildersb=newStringBuilder();//新建一个S.length()长度的数组,初始值为-1,需要替换的地方将数组的值置为indexs数组的下标。int[]hash=newint[S.length()];Arrays.fill(hash,-1);for(inti=0;i<indexes.length;i++){intidx=indexes[i];if(S.indexOf(sources[i],indexes[i])==indexes[i]){hash[idx]=i;}}//查找出需要替换的字符串存入map,Map效率没有数组高//Map<Integer,Integer>replaceMap=newHashMap<>();//for(inti=0;i<indexes.length;i++){//intindex=indexes[i];//if(S.indexOf(sources[i],index)==index){//replaceMap.put(index,i);//}//}//遍历字符串,将字符串转换为字节,添加到StringBuilder的中,需要替换的地方将原来的值替换掉for(inti=0;i<S.length();){if(hash[i]>=0){sb.append(targets[hash[i]]);i+=sources[hash[i]].length();}else{sb.append(S.charAt(i));i++;}}returnsb.toString();}个人公众号

扫码关注公众号(搜索公众号:平头哥的技术博文)一起交流学习呗

普通会员

0

帖子

298

回复

308

积分
沙发
发表于 2019-12-12 05:01:00

好好好

普通会员

0

帖子

300

回复

307

积分
板凳
发表于 2021-05-03 22:11:05

还是很厉害的

普通会员

0

帖子

330

回复

334

积分
地板
发表于 2023-09-09 02:51:25

谢谢楼主分享

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017