题解 | #分品种#

分品种

https://www.nowcoder.com/practice/9af4e93b04484df79d4cc7a863343b0b

  1. 题目考察的知识点

哈希表,字符串,贪心算法

  1. 题目解答方法的文字分析

创建列表list装载每个牛名片段的长度,创建哈希表装载每组的牛的品种名字各个字母。保证一个字母只能在一个组中出现。首先遍历字符串s,将字符串s中各个字符的数量存进数组dig。然后遍历字符串,遍历一个字符,就减去dig数组中对应字母的数量,同时将set里面没有的字符加入到set中。每次dig中某一个字符的数量为0时,将对应的字符从set中移除。当set为空时,count就是当前牛名的长度,将其存进list中。最后将list转换成int[]即为答案。

  1. 本题解析所用的编程语言

java

  1. 完整且正确的编程代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return int整型一维数组
     */
    public int[] partitionLabels (String s) {
        List<Integer> list =new  ArrayList<>();
        // 记录字符串s中各个字符的数量
        int[] dig = new int[26];
        HashSet<Character> set = new HashSet<>();
        // 字符串s中个字符的数量存进dig
        for(int i=0;i<s.length();i++){
           dig[s.charAt(i)-'a']++;
        }
        // 计算并记录符合条件的表示每个牛名片段的长度的列表
        // count表示每个牛名片段的长度
        int count =0;
        // 遍历字符串
        for(int i=0;i<s.length();i++){
           count++;
        //    减去已经计算的字符
           dig[s.charAt(i)-'a']--;
        //    set装载当前牛名的所有字符
           if(!set.contains(s.charAt(i))){
               set.add(s.charAt(i));
           }
        //    当set为空时,代表字符串s中当前牛名的所有字符已经全部为0,满足一个字母只能在一个组中出现
           if(dig[s.charAt(i)-'a']==0){
             set.remove(s.charAt(i));
              if(set.isEmpty()){
                list.add(count);
                count=0;
              }
           }
        }
        // list转int[]
        int[] ans =new int[list.size()];
        int p=0;
        for(int i:list){
            ans[p++] = i;
        }
        return ans;
    }
}
全部评论

相关推荐

11-28 17:48
中山大学 C++
点赞 评论 收藏
分享
Noob1024:一笔传三代,人走笔还在
点赞 评论 收藏
分享
10-21 23:48
蚌埠坦克学院
csgq:可能没hc了 昨天一面完秒挂
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务