移位字符串分组

题目描述

给定一个字符串,对该字符串可以进行 “移位” 的操作,也就是将字符串中每个字母都变为其在字母表中后续的字母,比如:“abc” -> “bcd”。这样,我们可以持续进行 “移位” 操作,从而生成如下移位序列:

“abc” -> “bcd” -> … -> “xyz”
给定一个包含仅小写字母字符串的列表,将该列表中所有满足 “移位” 操作规律的组合进行分组并返回。

示例:

输入:[“abc”, “bcd”, “acef”, “xyz”, “az”, “ba”, “a”, “z”]
输出:
[
[“abc”,“bcd”,“xyz”],
[“az”,“ba”],
[“acef”],
[“a”,“z”]
]
解释:可以认为字母表首尾相接,所以 ‘z’ 的后续为 ‘a’,所以 [“az”,“ba”] 也满足 “移位” 操作规律。

分析

每一个字符串都可以移位成a开头的字符串,定义HashMap,把移位成a开头的字符串作为键,把移位过后能匹配键的字符串的集合作为值,返回值即可。

代码

class Solution {
    public String paixu(String s) {
		char[] c = s.toCharArray();
		if(c[0]!='a') {
			int cha = c[0]-'a';//需要移的位数
			for(int i=0;i<c.length;i++) {//每个字符都左移
				if((c[i]-cha)<'a')//如果移动后比'a'还小,加上26
					c[i]=(char) ((c[i]-cha+26));
				else
					c[i]=(char) ((c[i]-cha));
			}
			return new String(c);
		}else
			return new String(c);
	}
	public List<List<String>> groupStrings(String[] strings) {
        HashMap<String, List<String>> map = new HashMap<>();
        for(String str:strings) {
        	List<String> list1=new ArrayList<>();
        	list1.add(str);
        	if(map.containsKey(paixu(str))) {
        		List<String> list2=new ArrayList<>();
        		list2.addAll(map.get(paixu(str)));
        		list2.add(str);
        		map.put(paixu(str), list2);
        		continue;
        	}
        	map.put(paixu(str), list1);
        }
        List<List<String>> list3 = new ArrayList<>(map.values());
        return list3;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值