一、Easy 696 Count Binary Substrings

Input: "00110011"
Output: 6
Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01".
Input: "10101"
Output: 4
Explanation: There are 4 substrings: "10", "01", "10", "01" that have equal number of consecutive 1's and 0's.

  解题思路:由于字符串是0和1相互交叉的,因此:

  1.将s = "110001111000000"分成四个子字符串:group = {11 000 1111 000000}

  2.如果group[i] = 2, group[i+1]=3,那么两个组合起来,一定有11000或者是00111

  3.类似于000111的情况,那么就有‘0’*3+‘1’*3,‘0’*2+‘1’*2,‘0’*1+‘1’*1,一共三种情况,因此如果group[i]和group[j]中的最小长度就是可以构成的个数

  解题代码:

  (1)(O(N) + O(1))   注意groups[++t] = 1;和groups[t]++;的表示技巧。

    public int countBinarySubstrings(String s) {
int[] groups = new int[s.length()];
int t = 0;
groups[0] = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i-1) != s.charAt(i)) {
groups[++t] = 1;
} else {
groups[t]++;
}
} int ans = 0;
for (int i = 1; i <= t; i++) ans += Math.min(groups[i-1], groups[i]);
return ans;
}

  (2)不用group数组而是直接使用两个int类型的数prev和curr来存储每个部分的长度

class Solution {
public int countBinarySubstrings(String s) {
int ans = 0, prev = 0, cur = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i-1) != s.charAt(i)) {
ans += Math.min(prev, cur);
prev = cur;
cur = 1;
} else {
cur++;
}
}
return ans + Math.min(prev, cur);
}
}

  二、Easy 686. Repeated String Match

For example, with A = "abcd" and B = "cdabcdab".
Return 3, because by repeating A three times (“abcdabcdabcd”),
B is a substring of it; and B is not a substring of A repeated two times ("abcdabcd").

  1.解法思路

  求出满足A*k(k=1,2,3...n)的子字符串是B的最小的k值。

  2.解法代码

  时间复杂度O(N∗(N+M))

  空间复杂度O(M+N)

  需要学习的地方:①使用StringBuilder可以一次性append一个字符串。

          ②for ( ; sb.length() < B.length(); number++) sb.append(A);注意for循环的这种使用技巧与number++的位置。

          ③使用sb.indexOf(B) >= 0和sb.append(A).indexOf(B) >= 0结合sb.length() < B.length()条件很方便地判断出结果来。

    public int repeatedStringMatch(String A, String B) {
int number = 1;
StringBuilder sb = new StringBuilder(A);
for ( ; sb.length() < B.length(); number++) sb.append(A);
if (sb.indexOf(B) >= 0) return number;
if (sb.append(A).indexOf(B) >= 0) return number+1;
return -1;
}

  三、680. Valid Palindrome II

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome. 

  1.正常算法Brute Force [Time Limit Exceeded]

    public boolean validPalindrome(String s) {
for (int i = 0; i < s.length(); i++) {
StringBuilder sb = new StringBuilder(s.substring(0, i).concat(s.substring(i+1)));
String result = sb.toString();
if (result.equals(sb.reverse().toString())) return true;
}
return false;
} 或者
public boolean isPalindrome(CharSequence s) {
for (int i = 0; i < s.length() / 2; i++) {
if (s.charAt(i) != s.charAt(s.length() - 1 - i)) {
return false;
}
}
return true;
}
public boolean validPalindrome(String s) {
StringBuilder sb = new StringBuilder(s);
for (int i = 0; i < s.length(); i++) {
char c = sb.charAt(i);
sb.deleteCharAt(i);
if (isPalindrome(sb)) return true;
sb.insert(i, c);
}
return isPalindrome(s);
}

  2.贪心算法Greedy[Accepted](TODO)

  

  四、67. Add Binary

Input: a = "1010", b = "1011"
Output: "10101"

  1.传统方法

    public String addBinary(String a, String b) {
String longStr = (a.length() > b.length()) ? a : b;
String shortStr = (a.length() > b.length()) ? b : a;
StringBuilder sb = new StringBuilder();
boolean isCarry = false;
for (int i = shortStr.length()-1; i >= 0; i--) {
if (isCarry) {
if ((longStr.charAt(longStr.length()-shortStr.length()+i) == '0' && shortStr.charAt(i) == '0')) {
sb.append('1');
isCarry = false;
} else if (longStr.charAt(longStr.length()-shortStr.length()+i) == '0' && shortStr.charAt(i) == '1') {
sb.append('0');
isCarry = true;
} else if (longStr.charAt(longStr.length()-shortStr.length()+i) == '1' && shortStr.charAt(i) == '0') {
sb.append('0');
isCarry = true;
} else {
sb.append('1');
isCarry = true;
}
} else {
if ((longStr.charAt(longStr.length()-shortStr.length()+i) == '0' && shortStr.charAt(i) == '0')) {
sb.append('0');
} else if (longStr.charAt(longStr.length()-shortStr.length()+i) == '0' && shortStr.charAt(i) == '1') {
sb.append('1');
} else if (longStr.charAt(longStr.length()-shortStr.length()+i) == '1' && shortStr.charAt(i) == '0') {
sb.append('1');
} else {
sb.append('0');
isCarry = true;
}
} } for (int i = longStr.length() - shortStr.length() - 1; i >= 0; i--) {
if (isCarry) {
if (longStr.charAt(i) == '1') {
sb.append('0');
isCarry = true;
} else {
sb.append('1');
isCarry = false;
}
} else {
sb.append(longStr.charAt(i));
}
}
if (isCarry) sb.append('1');
return sb.reverse().toString();
}

传统方法

  2.非传统数学方法(TODO)(或者是使用堆栈)

    public String addBinary(String a, String b) {
StringBuilder sb = new StringBuilder();
int i = a.length() - 1, j = b.length() -1, carry = 0;
while (i >= 0 || j >= 0) {
int sum = carry;
if (j >= 0) sum += b.charAt(j--) - '0';
if (i >= 0) sum += a.charAt(i--) - '0';
sb.append(sum % 2);
carry = sum / 2;
}
if (carry != 0) sb.append(carry);
return sb.reverse().toString();
}

  五、

 

Leetcode Tags(3)String(TODO)的更多相关文章

  1. Android实战简易教程-第二十八枪(Uri转String型实例)

    接上一篇文章.我们能够轻易的获取所选图片的uri,那么我们考虑怎样将获取的uri转换成String型的地址呢? 接下来我们通过实例来研究.布局文件和上篇(二十七枪)一致,我们就不再列出,直接看Main ...

  2. Redis常用命令(key、string、List)

    1.Key 1.keys *   查询所有数据 2.exists key名   判断key名是否存在 3.move key名  数据库号(0-15)  移动数据key名到相应的数据库 4.expire ...

  3. 字符串后面空字符的问题(char*与string的转换)

    今天AC了不少题,困扰已久的Time limit error 也解决了,记住下次用STL容器的时候一定要清空容器. 其次是字符数组与字符串的浅谈. 字符数组是以'\0'结尾的,所以在字符数组赋值给字符 ...

  4. LeetCode | Reverse Words in a String(C#)

    题目: Given an input string, reverse the string word by word. For example,Given s = "the sky is b ...

  5. Java_字符类(Character、String、StringBuffer)_char是基本数据类型,Character是其包装类型。

         在java中有三个类负责对字符的操作:Character.String.StringBuffer.其中,Character类是对单个字符进行操作,String是对一个字符序列的操作,Stri ...

  6. E - Phone List(字典序,string类型使用)

    Description Given a list of phone numbers, determine if it is consistent in the sense that no number ...

  7. 常见对象(int和String类型的相互转换)

    public class Test03 { //基本数据类型包装类有八种,其中其中都有parsexxx的方法 //可以加将这七种字符串表现形式转换成基本数据类型 //char的包装类Character ...

  8. 技能UP:SAP OBYC自动记账的实例说明(含value String应用说明)

    一. 自动过账原理 在MM模块的许多操作都能实现在FI模块自动过账,如PO收货.发票验证(LIV).工单发料.向生产车间发料等等.不用说,一定需要在IMG中进行配置才可以实现自动处理.但SAP实现的这 ...

  9. intellij系列编辑器个性化注释说明(定义个人风格的todo)

    有时候我们需要用于自己个性化的注释,不为装逼,只为能够快速找到自己的注释,自己的代码,不迷路... 废话少说,孩儿们看过来: 1.打开你的编辑器,打开setting,搜索TODO: 设置完点击保存去试 ...

随机推荐

  1. Android Studio [相对布局RelativeLayout]

    <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...

  2. Flume系列一之架构介绍和安装

    Flume架构介绍和安装 写在前面 在学习一门新的技术之前,我们得知道了解这个东西有什么用?我们可以使用它来做些什么呢?简单来说,flume是大数据日志分析中不能缺少的一个组件,既可以使用在流处理中, ...

  3. Maven 梳理 - 常用三种archetype说明

    archetype:原型的意思,可理解为Maven项目模板工具包 常用archetype 1.cocoon-22-archetype-webapp 2.maven-archetype-quicksta ...

  4. <q> 与 <blockquote> 的区别

    <q> 标签在本质上与 <blockquote> 是一样的.不同之处在于它们的显示和应用.<q> 标签用于简短的行内引用.如果需要从周围内容分离出来比较长的部分(通 ...

  5. 【ADO.NET基础-Session】Session的基本应用

    在服务端存储状态的对象:Session和Application 在客户端存储状态的对象:Cookie 1.Session:每个独立的浏览器都会创建一个独立的Session,不是一台电脑一个Sessio ...

  6. 说说 Java 线程间通信

    序言 正文 一.Java线程间如何通信? 线程间通信的目标是使线程间能够互相发送信号,包括如下几种方式: 1.通过共享对象通信 线程间发送信号的一个简单方式是在共享对象的变量里设置信号值:线程A在一个 ...

  7. Lxde添加触摸板双击功能、防误触

    前言 本文链接:https://www.cnblogs.com/hellxz/p/linux_touchpad_settings.html 这时简单记录一下最近两天折腾Lxde的触摸板功能的设置,留待 ...

  8. php一行代码获取本周一,本周日,上周一,上周日,本月一日,本月最后一日,上月一日,上月最后一日日期

    <?php //本周一 echo date('Y-m-d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600)); // ...

  9. 《Java语言程序设计》编程练习6.31(财务应用程序:信用卡号的合法性)

    6.31(财务应用程序:信用卡号的合法性)信用卡号遵循下面的模式.一个信用卡号必须是13到16位的整数.它的开头必须是: 4,指Visa卡 5,指Master卡 37,指American Expres ...

  10. 《完美解决系列》Android5.0以上 Implicit intents with startService are not safe

    在Android6.0上,使用了以下代码: Intent intent = new Intent(); intent.setAction("xxx.server"); bindSe ...