题535、TinyURL 的加密与解密

一、题目

TinyURL是一种URL简化服务, 比如:当你输入一个URL https://leetcode.com/problems/design-tinyurl 时,它将返回一个简化的URL http://tinyurl.com/4e9iAk.
要求:设计一个 TinyURL 的加密 encode 和解密 decode 的方法。你的加密和解密算法如何设计和运作是没有限制的,你只需要保证一个URL可以被加密成一个TinyURL,并且这个TinyURL可以用解密方法恢复成原本的URL。1

二、思路

我的想法就是直接将简化过的地址和原来地址存储在Map中。

长变短,转换的时候先查询有没有,有就直接输出,没有就进行生成。
短边长的时候直接查询就行了。

生成的原理:

直接随机生成一串字符,代替原本的URL,字符串越长,容量就越大,生成之后查询是否重复了,重复就继续生成,没有就直接进行下一步。

转换思路不唯一。

三、代码

import java.util.HashMap;

public class T0535 {

    public static void main(String[] args) {
        Codec codec = new Codec();

        System.out.println( codec.encode("https://leetcode.com/problems/design-tinyurl") );
        System.out.println( codec.decode(codec.encode("https://leetcode.com/problems/design-tinyurl")) );
    }

}
class Codec {

    final private HashMap<String, String> dicLtoS= new HashMap<String, String>();
    final private HashMap<String, String> dicStoL = new HashMap<String, String>();
    final private String dic = "QWERTYUIOPASDFGHJKLZXCVBNM1234567890qwertyuiopasdfghjklzxcvbnm";

    // Encodes a URL to a shortened URL.
    public String encode(String longUrl) {

        final String title = "http://tinyurl.com/";
        String tail = "";

        if( longUrl == null )
            return null;
        else if( dicLtoS.containsKey(longUrl) )
            return title + dicLtoS.get( longUrl );
        else{

            while ( true ) {
                tail = "";
                for (int i = 0; i < 6; i++) {
                    tail = tail + dic.charAt((int) (Math.random() * 56));
                }

                if( !dicLtoS.containsValue(tail) )
                    break;
            }
            dicStoL.put(tail, longUrl);
            dicLtoS.put(longUrl, tail);
            return title+tail;
        }
    }

    // Decodes a shortened URL to its original URL.
    public String decode(String shortUrl) {

        if( shortUrl == null )
            return null;
        else {
            String tail = shortUrl.substring(19);
            if( dicStoL.containsKey( tail ) )
                return dicStoL.get( tail );
            else
                return null;
        }

    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.decode(codec.encode(url));


  1. 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/encode-and-decode-tinyurl
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值