一、题目
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));
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/encode-and-decode-tinyurl
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎