string类问题总结

1. Unique Characters of a String 字符串中不同的字符

Implement an algorithm to determine if a string has all unique characters. What if you cannot use additional data structure?

思路分析:这道题让我们判断一个字符串中是否有重复的字符,要求不用特殊的数据结构,这里应该是指哈希表之类的不让用。像普通的整型数组应该还是能用的,这道题的小技巧就是用整型数组来代替哈希表,在之前Bitwise AND of Numbers Range 数字范围位相与的解法二中也用到过这种方法。由于ASCII表里的基本表共有128个字符,也就是可以用键盘表示出来的,整个表共有256个字符,所以我们只要用一个大小为256的整型数组就可以包含所有的字符,我们遍历输入字符串,对每一个字符都存入到相应位置,并赋值1,如果遇到已经为1的,说明之前出现过该字符,返回false,如果遍历完s,则返回true,代码如下:

我把i的值做了+1处理,防止aab这样的特例出现

 1 public class Solution {
 2     /**
 3      * @param str: a string
 4      * @return: a boolean
 5      */
 6     public boolean isUnique(String str) {
 7         if (str == null) {
 8             return false;
 9         }
10         int chars[] = new int[256];
11         int size = str.length();
12         for (int i = 0; i < size; i++) {
13             char current = str.charAt(i);
14             if (chars[(int)current] != 0) {
15                 return false;
16             }
17             chars[(int)current] = i + 1;//aab的反例
18         }
19         return true;
20     }
21 }

unique char

2.上面题的马甲变形-----isPermutation

判断是不是permutation其实就是判断两个字符串中各个字母的数量是否相等!!!

复杂度为0(n)

 1 private static boolean isPer(String A, String B) {
 2         if (A == null && B == null) {
 3             return true;
 4         }
 5         if (A == null || B == null) {
 6             return false;
 7         }
 8         int size1 = A.length();
 9         int size2 = B.length();
10         if (size1 != size2) {
11             return false;
12         }
13
14         int count[] = new int[256];
15         for (int i = 0; i < size1; i++) {
16             char current = A.charAt(i);
17             count[(int)current]++;
18             current = B.charAt(i);
19             count[(int)current]--;
20         }
21
22         for (int i = 0; i < 256; i++) {
23             if (count[i] != 0) {
24                 return false;
25             }
26         }
27         return true;
28     }

isPermutation

如果不考虑复杂度,可以讲两个stringsort一遍,然后进行逐个char的比对

3. Group Anagrams

Given an array of strings, group anagrams together.

For example, given: ["eat", "tea", "tan", "ate", "nat", "bat"]
Return:

[
  ["ate", "eat","tea"],
  ["nat","tan"],
  ["bat"]
]

 

排序哈希表法

复杂度

时间 O(NKlogK) 空间 O(N)

思路

判断两个词是否是变形词,最简单的方法是将两个词按字母排序,看结果是否相同。这题中我们要将所有同为一个变形词词根的词归到一起,最快的方法则是用哈希表。所以这题就是结合哈希表和排序。我们将每个词排序后,根据这个键值,找到哈希表中相应的列表,并添加进去。为了满足题目字母顺序的要求,我们输出之前还要将每个列表按照内部的词排序一下。可以直接用Java的Collections.sort()这个API。

注意

将字符串排序的技巧是先将其转换成一个char数组,对数组排序后再转回字符串

 1 public class Solution {
 2     public List<List<String>> groupAnagrams(String[] strs) {
 3         Map<String, List<String>> map = new HashMap<String, List<String>>();
 4         for(String str : strs){
 5             // 将单词按字母排序
 6             char[] carr = str.toCharArray();
 7             Arrays.sort(carr);
 8             String key = new String(carr);
 9             List<String> list = map.get(key);
10             if(list == null){
11                 list = new ArrayList<String>();
12             }
13             list.add(str);
14             map.put(key, list);
15         }
16         List<List<String>> res = new ArrayList<List<String>>();
17         // 将列表按单词排序
18         for(String key : map.keySet()){
19             List<String> curr = map.get(key);
20             Collections.sort(curr);
21             res.add(curr);
22         }
23         return res;
24     }
25 }

时间: 2024-08-04 11:01:51

string类问题总结的相关文章

java String 类 基础笔记

字符串是一个特殊的对象. 字符串一旦初始化就不可以被改变. String s = "abc";//存放于字符串常量池,产生1个对象 String s1=new String("abc");//堆内存中new创建了一个String对象,产生2个对象 String类中的equals比较字符串中的内容. 常用方法: 一:获取 1.获取字符串中字符的个数(长度):length();方法. 2.根据位置获取字符:charAt(int index); 3.根据字符获取在字符串中

String类实现

String类是应用框架中不可或缺的类 重载运算符实现字符串的操作 #idndef IOTECK_STRING_H_#define IOTECK_STRING_H_namespace iotek{ class String { public: String(const char*=NULL); ~String(); String(const String&); //拷贝构造函数 //String a; a=b; String& operator=(const String &);

String类

一.概述 Sting s1 = "abc";    //s1是一个类类型变量,"abc"是一个对象. String s2 = new String("abc"); //s1 . s2 的区别: 前者在内存中有一个对象,后者在内存中有两个对象. s1.equals(s2) 为true  因为 String复写了equals方法 二.常见的功能-获取和判断 获取: 1.int length(); 获取长度 2.char chatAt(int inde

C++实现String类

这是一道十分经典的面试题,可以短时间内考查学生对C++的掌握是否全面,答案要包括C++类的多数知识,保证编写的String类可以完成赋值.拷贝.定义变量等功能. #include<iostream> using namespace std; class String { public: String(const char *str=NULL); String(const String &other); ~String(void); String &operator =(cons

java中String类的构造函数

String类中的构造函数String(); 构造一个空字符串对象String(byte[] bytes); 通过byte数组构造字符串对象String(byte[] bytes,int offset,int length);通过byte数组,从offset开始,总共length长的字节构造字符串对象String(char[] value); 通过char数组构造字符串对象String(byte[] char,int offset,int length);通过char数组,从offset开始,总

Java (六、String类和StringBuffer)

Java String 类 字符串广泛应用 在Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串. 创建字符串 // ==比较的是字符串在栈中存放的首地址,而equals()比较的是两个字符串的内容是否相同 //普通的声明字符串的方法,只会在字符串常量池里开辟空间,并且开辟空间之前,会检查字符串常量池里是否已存在 //相同的数据,如果有,直接指向已存在的数据,如果没有会在字符串常量池里开辟一个新的空间 String s = "ccy"

JAVA API(一)String类和StringBuffer类

1.String类和StringBuffer类 在程序中经常会用到字符串,所谓的字符串就是指一连串的字符,它是由多个单个字符连接而成的.字符串中可以包含任意字符,这些字符必须包含在一对双引号""之内,如"abc".在Java中定义了String和StringBuffer类来封装字符串,并提供了一系列操作字符串的方法,它们都位于java.lang包中,因此不需要导包就可以直接使用.下面将对String类和StringBuffer类详细讲解. 1.1String类的初始

String类replaceAll方法正则替换深入分析

作者网址: https://my.oschina.net/shipley/blog/98973 背景:      前几天有人发了一个关于下面问题的贴,对这个有点好奇,故花时间做了点研究.        对单个反斜杠字符串替换成双斜杠的Java实现如下:    String s = "\\";    方法一:String sr1 = s.replaceAll("\\\\", "\\\\\\\\");    方法二:String sr1 = s.re

java11-3 String类的获取功能

package cn_String2;/* String类的获取功能 int length():获取字符串的长度. char charAt(int index):获取指定索引位置的字符 int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引. 为什么这里是int类型,而不是char类型? 原因是:'a'和97其实都可以代表'a' int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引. int indexOf(int ch,int

C++的string类

关于头文件cstring,提供了strlen及很多与字符串相关的函数的声明. 头文件string,要使用string类,必须在程序中包含头文件string,string类位于std中,必须提供一条using编译指令,或者使用std::string来引用它. 1.string类的使用: 不能将一个数组赋给另一个数组,但可以将一个string对象赋给另一个string对象. size()是string类的一个方法.可以将C++里边的string类理解成类型,我觉的可以理解成,创建:一个新类型,就像j