集合是一个相对来讲比较好懂的数据结构,在高中课本中集合就是不重复的一组数据,那么我们如何用代码描述集合呢,我们前面讨论过二叉树这个概念,这个概念是没有重复元素的,也就是说,我们完全可以用二叉树这个数据结构为基础实现一个集合,具体代码如下
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();
}
这样我们就解出了这道题。
未完待续~~