1、字符串的最大公因子
//对于字符串 S 和 T,只有在 S = T + ... + T(T 自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。 // // 返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。 // // // // 示例 1: // // //输入:str1 = "ABCABC", str2 = "ABC" //输出:"ABC" // // // 示例 2: // // //输入:str1 = "ABABAB", str2 = "ABAB" //输出:"AB" // // // 示例 3: // // //输入:str1 = "LEET", str2 = "CODE" //输出:"" // // // // // 提示: // // // 1 <= str1.length <= 1000 // 1 <= str2.length <= 1000 // str1[i] 和 str2[i] 为大写英文字母 // // Related Topics 字符串
直接先用两个字符串长度的公因子,然后再判断两个字符串是不是可以由N个公因子长度的子字符串拼接而成。检测是否能够由子字符串拼接而成也是先从字符串长度入手,两者长度相除得到M,看看M个子字符串是否能够拼成整个字符串。
public String gcdOfStrings(String str1, String str2) {
int len1 = str1.length(), len2 = str2.length();
int length = Math.min(len1, len2);
for (int i = length; i >=1 ; i--) {
if(len1 % i == 0 && len2 % i == 0){
String X = str1.substring(0, i);
if(check(X,str1) && check(X, str2)){
return X;
}
}
}
return "";
}
private boolean check(String t, String s){
int lenx = s.length() / t.length();
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= lenx; i++) {
sb.append(t);
}
return sb.toString().equals(s);
}
2、IP地址无效化
//给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。 // // 所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."。 // // // // 示例 1: // // 输入:address = "1.1.1.1" //输出:"1[.]1[.]1[.]1" // // // 示例 2: // // 输入:address = "255.100.50.0" //输出:"255[.]100[.]50[.]0" // // // // // 提示: // // // 给出的 address 是一个有效的 IPv4 地址 // // Related Topics 字符串
public String defangIPaddr(String address) {
StringBuffer sb1 = new StringBuffer(address);
StringBuffer sb2 = new StringBuffer();
for (int i = 0; i < sb1.length(); i++) {
if(sb1.charAt(i) == '.'){
sb2.append("[.]");
}else{
sb2.append(sb1.charAt(i));
}
}
return sb2.toString();
}
3、转变日期格式
//给你一个字符串 date ,它的格式为 Day Month Year ,其中: // // // Day 是集合 {"1st", "2nd", "3rd", "4th", ..., "30th", "31st"} 中的一个元素。 // Month 是集合 {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oc //t", "Nov", "Dec"} 中的一个元素。 // Year 的范围在 [1900, 2100] 之间。 // // // 请你将字符串转变为 YYYY-MM-DD 的格式,其中: // // // YYYY 表示 4 位的年份。 // MM 表示 2 位的月份。 // DD 表示 2 位的天数。 // // // // // 示例 1: // // 输入:date = "20th Oct 2052" //输出:"2052-10-20" // // // 示例 2: // // 输入:date = "6th Jun 1933" //输出:"1933-06-06" // // // 示例 3: // // 输入:date = "26th May 1960" //输出:"1960-05-26" // // // // // 提示: // // // 给定日期保证是合法的,所以不需要处理异常输入。 // // Related Topics 字符串
public String reformatDate(String date) {
String[] arr = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
String[] s = date.split(" ");
StringBuffer sb = new StringBuffer();
sb.append(s[2]);
sb.append("-");
for (int i = 0; i < 12; i++) {
if(s[1].equals(arr[i])){
if(i<=8 && i>=0){
sb.append(0);
}
sb.append(i+1);
sb.append("-");
break;
}
}
String str = s[0].substring(0, s[0].length()-2);
if(str.length() == 1){
sb.append(0);
}
sb.append(str);
return sb.toString();
}
4、 解码字母到整数映射
//给你一个字符串 s,它由数字('0' - '9')和 '#' 组成。我们希望按下述规则将 s 映射为一些小写英文字符: // // // 字符('a' - 'i')分别用('1' - '9')表示。 // 字符('j' - 'z')分别用('10#' - '26#')表示。 // // // 返回映射之后形成的新字符串。 // // 题目数据保证映射始终唯一。 // // // // 示例 1: // // 输入:s = "10#11#12" //输出:"jkab" //解释:"j" -> "10#" , "k" -> "11#" , "a" -> "1" , "b" -> "2". // // // 示例 2: // // 输入:s = "1326#" //输出:"acz" // // // 示例 3: // // 输入:s = "25#" //输出:"y" // // // 示例 4: // // 输入:s = "12345678910#11#12#13#14#15#16#17#18#19#20#21#22#23#24#25#26#" //输出:"abcdefghijklmnopqrstuvwxyz" // // // // // 提示: // // // 1 <= s.length <= 1000 // s[i] 只包含数字('0'-'9')和 '#' 字符。 // s 是映射始终存在的有效字符串。 // // Related Topics 字符串
public String freqAlphabets(String s) {
String ans = "";
for (int i = 0; i < s.length(); i++) {
if(i + 2 < s.length() && s.charAt(i+2) == '#'){
ans += (char)((s.charAt(i)-'0') * 10 + (s.charAt(i+1)-'1')+'a');
i += 2;
}else{
ans += (char)(s.charAt(i) - '1' + 'a');
}
}
return ans;
}