LeetCode

LeetCode

1.字符串

案例一:给定彼此独立的两颗树的头节点t1和t2,判断t1中是否有与t2树拓扑结构完全相同的子树

用KMP算法 : 将两个数序列化成字符串,变成寻找公共子串问题。

案例二:给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数一样,那么str1和str2互为变形词,请实现函数判断两个字符串是否互为变形词。

使用哈希表做字符计数 对str1做字符计数成哈希表1,对str2做字符计数成哈希表2,对比哈希表1与哈希表2的记录是否一致。可用长度固定的数组代替哈希表结构,实现复杂度为O(N),额外的空间复杂度为O(N)。

public  boolean isDeformation(String s1,String s2){
		 int len = s1.length();
		 int len2 = s2.length();
		 if(len!=len2||s1==null||s2==null){
			 return false;
		 }
		 char[] ch1 = s1.toCharArray();
		 char[] ch2 = s2.toCharArray();
		 int[] a = new int[256];
		 for(int i=0;i<ch1.length;i++){
			 a[ch1[i]]++;
		 }
		 for(int i=0;i<ch2.length;i++){
			 a[ch2[i]]--;
			 if(a[ch2[i]]<0){
				 return false;
			 }
		 }
		 return true;
	 }

案例三:判断一个字符串是否为另一个字符串的旋转词,如abcd 的旋转词为 abcd bcda cdab dabc

方法:

  1. 判断str1和str2是否长度相等
  2. 如果长度相等,生成str1+str1的大字符串
  3. 用KMP算法判断大字符串中是否包含str2

案例四:给定一个字符串str,请在单词间做逆序调整

方法:

1.实现将字符串局部所有字符逆序的函数f

2.利用f将字符串所有字符逆序

3.找到逆序后的字符串中每一个单词的区域,利用f将每一个单词的区域逆序。

案例五:给定一个字符串str,和一个整数i,i代表str中的位置,将str【0…i】移到右侧,str【i+1.。N-1】

移到左侧。

方法:

1.将str【0…i】部分的字符逆序

2.将str【i+1.。N-1】部分的字符逆序

3.将str整体的字符逆序。

案例六:给定一个字符串类型数组strs,请找到一种中拼接顺序,是的将所有的字符串拼接起来组成的大字符串是所有可能性中字典顺序最小的,并返回这个大字符串。

方法:

如果str1+str2 < str2 + str1,则str1放前面,否在str2放前面。

案例七:给定一个字符串str,判断是不是整体有效的括号字符串

方法:

1.整形变量num,代表’(’ 出现次数与’)'出现次数的差值。

2.遍历过程中,如果遇到’(’,则num++。

3.遍历过程中,如果遇到’)’,则num–。

4.遍历过程中如果出现num<0,则直接返回false

5.如果一直没出现情况4,则一直遍历下去。

6.遍历完成后,如果num==0,则返回true,否在返会false;

案例八:给定一个字符串str,返回str的最长无重复字符串的长度。

方法:

需要两个变量: 1 哈希表map–> 'c’位置在map中的更新

​ 2 整型变量pre–> 根据当前最长无重复字符子串长度,更新pre。

public class StringDemo {
	public static void main(String[] args) {
		String s = "abcabdefa";
		System.out.println(getMaxSubString(s));
	}
	private static int getMaxSubString(String s) {
		char[] ch = s.toCharArray();
		int len = ch.length;
		HashMap<Character,Integer> map = new HashMap<>();
		int pre = 0;
		int maxLength = 0;
		for(int i=0;i<len;i++){
			if(map.containsKey(ch[i])){
				int preIndex = map.get(ch[i]);
				int tempLen = i - preIndex;
				if(pre>=tempLen){
					pre = tempLen;
				}else{
					pre = pre + 1;
				}
			}else{
				pre = pre + 1;
			}
			map.put(ch[i], i);
			if(pre>maxLength){
				maxLength = pre;
			}
			map.put(ch[i],i);
		}
		return maxLength;
	}
}

你可能感兴趣的:(JAVASE)