编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题思路:双指针(相向指针)
代码:
- public static void reverseString(char[] s) {
- int i = 0 ,j = s.length-1;
- while(i < j) {
- char temp = s[i];
- s[i] = s[j];
- s[j] = temp;
- i++;
- j--;
- }
- }
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
解题思路:双指针(同向指针)
代码:
-
- public static String compressString(String S) {
- char[] s = S.toCharArray();
- int number = 0;
- String newS = new String();
- for (int i = 0 ; i< s.length ; i = i+number) {
- number = 0;
- for (int j = i; j < s.length; j++){
- if (s[i] == s[j]) {
- number++;
- }else {
- break;
- }
- }
- newS = newS + s[i] + number;
- }
- return newS.length() < S.length() ? newS : S;
- }
题目说明:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
解法一:暴力算法
O(n3)的时间复杂度解法:
- public static int lengthOfLongestSubstring(String s) {
- String maxSubS = new String();
- char[] sc = s.toCharArray();
- for (int i = 0 ;i<s.length();i++){
- String tempS = new String();
- for(int j=i;j<s.length();j++) {
- if(tempS.contains(String.valueOf(sc[j]))){
- break;
- } else {
- tempS += sc[j];
- }
- }
- if (tempS.length() > maxSubS.length()) {
- maxSubS = tempS;
- }
- }
- return maxSubS.length();
- }
解法二:滑动窗口