leetcode 3 无重复字符的最长子串
class Solution {
public int lengthOfLongestSubstring(String s) {
// map记录字符串中字符和它出现的下标
Map<Character, Integer> map = new HashMap<>();
// 字符串长度
int len = s.length();
// 标记
int left = 0;
int right = 0;
// 最终返回结果
int res = 0;
for(;right<len;right++){
// 当出现过某个字符时,进入if
if(map.containsKey(s.charAt(right))){
// 更新结果
res = Math.max(right-left, res);
// 更新左边界,⭕其中max方法是本题关键,避免"abba"这种示例
left = Math.max(map.get(s.charAt(right))+1,left);
}
map.put(s.charAt(right),right);
}
res = Math.max(res, right-left);
return res;
}
}
leetcode 6 Z字形变换
// v1.0 用二维数组存放字符串数据
class Solution {
public String convert(String s, int numRows) {
if(numRows==1){
return s;
}
int len = s.length();
Character[][] table = new Character[numRows][len];
int row = 0, column = 0, size = 0;
boolean down = true;
while(size<len){
table[row][column] = s.charAt(size);
if(down){
row++;
}else{
row--;
column++;
}
if(row==0){
down = true;
}else if(row == numRows-1){
down = false;
}
size++;
}
String res = "";
for(int i=0;i<numRows;i++){
for(int j=0;j<len;j++){
if(table[i][j]!=null){
res += table[i][j];
}
}
}
return res;
}
}
// v2.0
class Solution {
public String convert(String s, int numRows) {
int len = s.length();
if(numRows==1){
return s;
}
StringBuilder[] array = new StringBuilder[numRows];
for(int i=0;i<numRows;i++){
array[i] = new StringBuilder();
}
int flag = 1;
int size = 0;
int index = 0;
while(size<len){
array[index].append(s.charAt(size));
if(index==0){
flag = 1;
}else if(index==numRows-1){
flag = -1;
}
index+=flag;
size++;
}
String res = "";
for(int i = 0;i<numRows;i++){
res+=array[i].toString();
}
return res;
}
}
leetcode 344 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。
class Solution {
public void reverseString(char[] s) {
char temp;
for(int i=0;i<s.length/2;i++){
temp = s[s.length-i-1];
s[s.length-i-1] = s[i];
s[i] = temp;
}
}
}
剑指offer05 替换空格
请实现一个函数,把字符串 s
中的每个空格替换成”%20”。
class Solution {
public String replaceSpace(String s) {
StringBuilder res = new StringBuilder();
for(char c : s.toCharArray()){
if(c==' '){
res.append("%20");
}else{
res.append(c);
}
}
return res.toString();
}
}
leetcode 151 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。
class Solution {
public String reverseWords(String s) {
if(s==null) return null;
char[] charArray = s.toCharArray();
int len = charArray.length;
int left = 0;
int right = len-1;
reverse(charArray,left,right);
word_reverse(charArray,len);
return clean_space(charArray,len);
}
//将char数组整个反转
public void reverse(char[] s, int i, int j){
while(i<j){
char c = s[j];
s[j--] = s[i];
s[i++] = c;
}
}
//反转单词
public void word_reverse(char[] s, int l){
int i=0;
int j=0;
while(j<l){
//找到单词首字母
while(i<l&&s[i]==' '){
i++;
}
j=i;
//找到单词末尾
while(j<l&&s[j]!=' '){
j++;
}
reverse(s,i,j-1);
i = j;
}
}
//清理多余空格
public String clean_space(char[] s, int l){
int i = 0;
int j = 0;
while(j<l){
while(j<l&&s[j]==' ') j++;
while(j<l&&s[j]!=' ') s[i++]=s[j++];
while(j<l&&s[j]==' ') j++;
if(j<l) s[i++] = ' ';
}
return new String(s).substring(0,i);
}
}
leetcode 394 字符串解码
class Solution {
public String decodeString(String s) {
LinkedList<Integer> num = new LinkedList<>();
LinkedList<String> str = new LinkedList<>();
int len = s.length();
StringBuilder res = new StringBuilder();
int curr = 0;
for(Character c:s.toCharArray()){
if(c=='['){
str.add(res.toString());
num.add(curr);
res = new StringBuilder();
curr = 0;
}else if(c==']'){
StringBuilder tmp = new StringBuilder(str.removeLast());
int curr_num = num.removeLast();
for(int i = 0;i<curr_num;i++){
tmp.append(res);
}
res = tmp;
}else if(c>='0'&&c<='9'){
curr = curr*10 + c-'0';
}else{
res.append(c);
}
}
return res.toString();
}
}
leetcode 438 找到字符串中所有字母异位词
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int[] countS = new int[26];
int[] countP = new int[26];
int lengthP = p.length();
int lengthS = s.length();
if(lengthP>lengthS) return new ArrayList<>();
for(int i=0;i<lengthP;i++){
countS[s.charAt(i)-'a']++;
countP[p.charAt(i)-'a']++;
}
List<Integer> res = new ArrayList<>();
if(Arrays.equals(countP,countS)){
res.add(0);
}
for(int i=lengthP;i<lengthS;i++){
countS[s.charAt(i)-'a']++;
countS[s.charAt(i-lengthP)-'a']--;
if(Arrays.equals(countP,countS)){
res.add(i-lengthP+1);
}
}
return res;
}
}