集合

集合是一个相对来讲比较好懂的数据结构,在高中课本中集合就是不重复的一组数据,那么我们如何用代码描述集合呢,我们前面讨论过二叉树这个概念,这个概念是没有重复元素的,也就是说,我们完全可以用二叉树这个数据结构为基础实现一个集合,具体代码如下

package BST;

public class BST<E extends Comparable<E>> {
    class Node{
        private E e;
        private Node left,right;
        Node(){
            this.e=null;
            this.right=null;
            this.left=null;
        }
        Node(E e){
            this.e=e;
            this.right=null;
            this.left=null;
        }
    }
    int size;
    Node root;
    BST(){
        this.root=null;
        this.size=0;
    }
    public int getSize() {
        return this.size;
    }
    boolean isEmpty(){
        return this.size==0;
    }
    public boolean contains(E e){
        return  contains(root,e);
    }
    public boolean contains(Node node,E e){
        if (node==null){
            return false;
        }
        if (e.compareTo(node.e)<0){
           return contains(node.left,e);
        }
        else if (e.compareTo(node.e)>0){
            return contains(node.right,e);
        }
        return true;
    }
    public void add(E e){
        add(root,e);
    }
    public Node add(Node node,E e){
        if (node==null){
            size++;
            return new Node(e);
        }
        if (e.compareTo(node.e)==0){
            return null;
        }
        else if (e.compareTo(node.e)>0){
            node.right= add(node.right,e);
        }
        else {
            node.left=add(node.left,e);
        }
        return node;
    }
}


public class BSTSet <E extends Comparable<E>> implements Set<E>{
    private BST<E>bst;
    public BSTSet(){
        bst=new BST<>();
    }

    @Override
    public boolean isEmpty() {
        // TODO Auto-generated method stub

        return bst.isEmpty();
    }

    @Override
    public void add(E e) {
        // TODO Auto-generated method stub
         bst.add(e);

    }

    @Override
    public int getSize() {
        // TODO Auto-generated method stub
       return bst.size();
    }

    @Override
    public void remove(E e) {
        // TODO Auto-generated method stub
        bst.removeMax();

    }

    @Override
    public void contains(E e) {
        // TODO Auto-generated method stub
        bst.contains(e);

    }

}

那么我们可以看到,在二叉树的基础下,可以不费力气的去构建一个集合出来,我们也可以试着用java中的util去解leetcode题目。
我们来看下leetcode804这个题目,

国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" 对应 "-...", "c" 对应 "-.-.", 等等。

为了方便,所有26个英文字母对应摩尔斯密码表如下:

[".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."]
给定一个单词列表,每个单词可以写成每个字母对应摩尔斯密码的组合。例如,"cab" 可以写成 "-.-..--...",(即 "-.-." + "-..." + ".-"字符串的结合)。我们将这样一个连接过程称作单词翻译。

返回我们可以获得所有词不同单词翻译的数量。
输入: words = ["gin", "zen", "gig", "msg"]
输出: 2
解释: 
各单词翻译如下:
"gin" -> "--...-."
"zen" -> "--...-."
"gig" -> "--...--."
"msg" -> "--...--."

共有 2 种不同翻译, "--...-." 和 "--...--.".

先来解释一下,首先规定了个字典,当输入gin这个字符串的时候,这个gin就会找对应的符号,最后统计不同的翻译个数,首先这个字符串不同,翻译可能相同,在实例中我们看到了gin与zen是相同的翻译码,gig和msg是相同的翻译码,那么我们如何做到去重并且统计出来个数呢,那就是集合这个数据结构,没有重复的元素。很方便的是,java,已经帮我们内置了Set所以,我们只需要调用里面的逻辑即可。
看我解题

    public int translationWord(String []word){
    //我们先定义字典
        String []mossDict={".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--.."};
        Set<String>set=new HashSet<>();
        //遍历输入的字符串数组
        for (String s : word) {
        //新建个字符串
            StringBuilder moss=new StringBuilder();
            //遍历单个字符串的内容
            for (int i = 0; i < s.length(); i++) {
                int x=s.charAt(i);
                //x-'a’就是字典中的标记位置,并且转化为需要的密码字符
               moss.append(mossDict[x-'a']);
            }
            //将其添加到Set中
            set.add(moss.toString());
    }	
    //输出set的个数
        return set.size();
    }

这样我们就解出了这道题。
未完待续~~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值