目录

题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。

题目:输入一个字符串,求字符的所有组合。

题目:输入一个含有8个数字的数组,把这8个数字放在正方体的8个顶点上,使得正方体上相对的面上的4个顶点的和都相等。

题目:N皇后问题。

题目:在一个字符串中找到第一个只出现一次的字符,并返回它的位置。

题目:定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符。

题目:定义一个函数,删除字符串中所有重复出现的字符。

题目:定义函数,判断两个字符是否互为变位词。

题目:字符流中第一个只出现一次的字符。


题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba.

看下图,用回溯法,直观明了。

图片来自牛客网剑指offer中一位网友的回答。

/*
这是一个字符串排列问题,考虑使用回溯法
可以分为两部分来做
第一部分:求所有可能在第一个位置的字符,即把第一个字符与后面所有字符交换,包括自己和自己交换
第二部分:固定第一个字符,求后面所有字符的排列,即又回到第一部分
其中注意一个问题:如果第一个字符与后面某一个位置字符相同,则不用交换
*/class Solution {
public:vector<string> Permutation(string str) {vector<string> all;if(str.size() == 0){return all;}string tmp;recur(str, tmp, all, 0);return all;}void recur(string str, string& tmp, vector<string> &all, int start){if(start < 0 || str.size() == 0){return;}if(str.size() == start){all.push_back(tmp);return;}for(int i = start; i < str.size(); i++){if(i != start && str[i] == str[start]){    //如果字符相同,不用交换continue;}swap(str[i], str[start]);tmp += str[start];recur(str, tmp, all, start + 1);tmp.pop_back();            //回溯法的关键}}
};

题目:输入一个字符串,求字符的所有组合。例如:输入abc,则它们的组合有a、b、c、ab、ac、bc、abc。其中ab和ba只是一种组合。

/*
输入n个字符,那么形成的组合长度有1、2、... 、n
在n个字符中求长m的字符时,可以分成两部分:第一个字符和其余所有字符
如果组合中包含第一个字符,则在剩余字符中求m-1个字符
如果组合中不包含第一个字符,则在剩余字符中求m个字符
就可以用递归的方法求解
*/
class Solution
{
public:vector<string> combination(string str){vector<string> all;if (str.size() == 0) {return all;}string tmp;for (int i = 1; i <= str.size(); i++) {recur(str, tmp, 0, i, all);}return all;}void recur(string str, string &tmp, int start, int number, vector<string>& all){if (number == 0) {all.push_back(tmp);return;}if (start == str.size()) {return;}if (number > str.size() - start) {return;}tmp += str[start];recur(str, tmp, start + 1, number - 1, all);tmp.pop_back();recur(str, tmp, start + 1, number, all);}
};

题目:输入一个含有8个数字的数组,判断有没有可能把这8个数字分别放在正方体的8个顶点上,使得正方体上三组相对的面上的4个顶点的和都相等。

/*
简而言之,这就是一个全排列问题
把这8个数全排列,之后判断正方体的三个像对面是否相等即可
*/
class Solutin{
public:bool cubeVertex(vector<int> vec) {if (vec.size() != 8) {return false;}return cubeCore(vec, 0);}bool cubeCore(vector<int>& vec, int start) {if (vec.size() != 8 || start < 0) {return false;}bool result = false;if (start == vec.size() - 1) { //判断正方体的三个相对面是否相等if (Sum(vec, 0, 1, 2, 3) == Sum(vec, 4, 5, 6, 7)&& Sum(vec, 0, 2, 4, 6) == Sum(vec, 1, 3, 5, 7)&& Sum(vec, 0, 1, 4, 5) == Sum(vec, 2, 3, 6, 7)) {result = true;}}else {for (int i = start; i < vec.size(); i++) {if (i != start && vec[i] == vec[start]) {continue;}swap(vec[i], vec[start]);result = cubeCore(vec, start + 1);if (result) {  //一旦为true,则直接break,后面无需在做排序break;}swap(vec[i], vec[start]);}}return result;}int Sum(vector<int> vec, int i, int j, int k, int l) {return vec[i] + vec[j] + vec[k] + vec[l];}
}

题目:N皇后问题,在一个N*N的棋盘上放置N个皇后,使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击),即任意两个皇后不得处于同一行、同一列、同意斜线上。

/*
经典的N皇后问题
假如N=4
我们可以定义一个数组column[4],数组中第i个数字表示位于第i行的皇后的列号
并将0,1,2,3分别放入数组中,放入的时候判断是否在同一列以及是否时一条斜线
它们肯定不会在同一行,因为数组下标0,1,2,3各不相同,因此所在行肯定不同
*/
class Solution{
public:int totalNQueens(int n) {if (n < 0) {return 0;}vector<int> vec(n);int sum = 0;QueenCore(0, n, vec, sum);return sum;}void QueenCore(int index, int n, vector<int> &vec, int &sum) {if (index >= n) {sum++;}else {for (int i = 0; i < n; i++) {vec[index] = i;if (Diagonal(vec, index)) { //判断是否在同一列或者是否在一条斜线上QueenCore(index + 1, n, vec, sum);}}}}bool Diagonal(const vector<int> &vec, int index) {for (int i = 0; i < index; i++) {if ((abs(vec[i] - vec[index]) == abs(i - index)) || vec[i] == vec[index]) {             return false;}}return true;}
}

题目:在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写)

/*
char是一次长度为8的数据类型。因此有256中可能。
创建一个大小为256的数组,下标对应ASCII码值,存储的数是出现的次数
*/
int FirstNotRepeatingChar(string str) {if(str.size() < 0 || str.size() > 10000) {return -1;}int* position = new int[256];for(int i = 0; i < 256; i++){position[i] = 0;}for(int i = 0; i < str.size(); i++){position[str[i]]++;}for(int i = 0; i < str.size(); i++){if(position[str[i]] == 1){return i;}}return -1;
}

题目:定义一个函数,输入两个字符串,从第一个字符串中删除在第二个字符串中出现的所有字符。

void deleteSubstring(string& str1, const string& str2){if(str1.size() == 0 || str2.size() == 0){return;}bool* map = new bool[256];for(int i = 0; i < 256; i++){map[i] = false;}for(int i = 0; i < str2.size(); i++){map[str2[i]] = true;}for(int it = str1.begin(); it != str1.end(); it++){if(map[*it] == true){str1.erase(it);}}
}

题目:定义一个函数,删除字符串中所有重复出现的字符。

void deleteDupstring(string& str){if(str.size() == 0){return;}bool* map = new bool[256];for(int i = 0; i < 256; i++){map[i] = false;}for(int it = str.begin(); it != str.end(); it++){if(map[*it] == true){str.erase(it);}else{map[*it] = true;}}
}

题目:在英语中,如果两个单词出现的字母相同,并且每个字母出现的次数也相同,那么两个单词护卫变位词。定义函数,是否互为变位词。

bool isAnagram(const string& str1, const string& str2){if(str1.size() == 0 || str2.size() == 0 || str1.size() != str2.size()){return false;}int* map = new int[256];for(int i = 0; i < 256; i++){map[i] = 0;}for(int i = 0; i < str1.size(); i++){map[str[i]]++;}for(int i = 0; i < str2.size(); i++){map[str[i]]--;}for(int i = 0; i < 256; i++){if(map[str[i]] != 0){return false;}}return true;
}

题目:字符流中第一个只出现一次的字符。

// 把字符流的字符一次保存下来
class Solution{
private:string str;int count[256];public:Solution() {for(int i = 0; i < 256; i++){count[i] = 0;}}void insert(char ch){str += to_string(ch);count[ch]++;}char firstOnce(){int len = str.size();for(int i = 0; i < len; i++){if(count[str[i]] == 1){return str[i];}}return '#';}
};// 不保存字符
class Solution1{
private:int index;int count[256];public:Solution1() : index(0) {for(int i = 0; i < 256; i++){count[i] = -1;}}void inset(char ch){if(count[ch] == -1){count[ch] = index;}else if(count[ch] >= 0){count[ch] = -2;}index++;}char firstOnce(){char tmp = '\0';int minIndex = INT_MAX;for(int i = 0; i < 256; i++){if(count[i] >= 0 && count[i] < minIndex){minIndex = count[i];tmp = char(i);}}return tmp;}
};

参考

剑指offer

算法题--字符串排列组合、n皇后、字符出现次数(C++)相关推荐

  1. python字符串排列组合子集_python编程题:字符串的(所有可能的)排列组合

    前言 在此研究: 1)给定一个字符串,如何对其中字母进行排列组合: 2)进一步了解Python递归. 题目内容 在指定位置编写代码,完成函数,根据给定的字符串,给出组成该字符串的字符的所有排列构成的字 ...

  2. 算法题字符串“~asd;4#1ebr67qwe234#13sdBd1d1,@3ret#156ghk123#1A34D”

    算法题字符串"~asd;4#1ebr&67qwe234#1&3sdBd1d1,@3ret#1&56ghk123#1A&34D" 使用3 个线程 a, ...

  3. java随机数去重排序_数组去重及排序/0~10随机数字/字符串中出现最多的字符及次数...

    数组去重及排序: var arr = [1,5,1,2,6,8,1,81,9,0]; for(var i=0;i for(var j=i+1;j if(arr[i] == arr[j]){ arr.s ...

  4. java 字符串排列组合_Java 程序计算列出字符串的所有排列组合

    Java 程序计算列出字符串的所有排列组合 在此示例中,我们将学习计算Java中字符串的所有排列组合. 要理解此示例,您应该了解以下Java编程主题: 字符串的排列是指可以通过互换字符串字符的位置来形 ...

  5. php 组合算法,PHP简单排列组合算法示例分享

    本文主要和大家介绍了PHP实现的简单排列组合算法,结合具体应用实例分析了排列组合算法的实现与使用技巧,需要的朋友可以参考下,希望能帮助到大家. 一.问题: 给你一个40斤的西瓜,给3个人分,有多少种分 ...

  6. 小白学算法:DFS排列组合问题

    准备: 一些用语及事项的说明,方便大家理解. 1.数组从一号索引开始用,不用0号索引. 2.dfs递归零次时称为深度1,递归一次称为深度2,以此类推. 3.每个深度dfs要进行一些操作,统称某深度运算 ...

  7. 找出字符串中出现最多的字符以及次数 JS

    let str = "abcdaaaaaaaa";/* 我们可以先定义一个对象来统计一下出现最多的字符以及次数 */let obj = {}/* 利用for循环我们可以将str的每 ...

  8. leetcode算法题--字符串的排列

    原题链接:https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/ vector<string> res; vector& ...

  9. java字符串排列组合算法

    前言 你的努力,终将成就无可替代的自己 本科毕业后就一直从事Java开发的工作,和多数人一样,最开始从事crud的工作,看着自己的同学一步一步往上走,自己还是在原地踏步,说实话这不是自己想要的状态. ...

  10. java字符串组合_Java实现abc字符串排列组合

    1.可重复排列:abc三个字符组成的所有长度为3的字符串,aaa,aab,aac......ccc 一共27种 利用递归的思想,第一个字符可以从abc中选择一个,三种选择,之后问题转化为abc组成长度 ...

最新文章

  1. 无序数组及其子序列的相关问题研究
  2. R语言ggplot2可视化:绘制堆叠的密度图(Stacked Area Chart)
  3. DeviceEventEmitter 使用监听通知进行传值
  4. Nginx 反向代理 负载均衡 虚拟主机
  5. canvas中的getContext()方法 以及 webgl中的getContext()方法
  6. SAP-HR三大结构
  7. python文件运行哪一个_如何使一个python文件运行另一个?
  8. mysql pxc 报错_登录mysqlpxc报错找不到库文件libreadline.so.7
  9. 云时代的大数据存储-云HBase
  10. 《python可以这样学》第一章
  11. HTTP请求报文格式与HTTP2.0
  12. 大数据发展现状和趋势
  13. 二分类模型评价指标-KS值
  14. 大数据讲课笔记2.1 初探大数据
  15. local class incompatible: stream classdesc serialVersionUID = -4601057296962918535, local class seri
  16. 职场内耗,正在让这个团队瓦解
  17. EUI组件之HScrollBar VScrollBar (滚动条,动态设置滑块图片)
  18. 【kali】kali2020.2安装 超级详细教程
  19. 人口红利消失,电销要怎么做才能立足市场?
  20. Python脚本25:将两张图片拼在一起

热门文章

  1. 短网址还原 php,php简单实现短网址(短链)还原的方法(测试可用),php还原_PHP教程...
  2. 云和人工智烈日当头,华为HPC解决方案如何应对?
  3. java 斜率求角度_计算两条线之间的角度而不必计算斜率? (Java)
  4. linux mint 搜狗 乱码,解决linux mint wine微信字体显示问题
  5. python如何爬取煎蛋图片(js)
  6. 螃蟹在剥我的壳,笔记本在写我。 漫天的我落在枫叶上雪花上。 而你在想我。
  7. HTML5微案例讲解系列视频课程-杨千锋-专题视频课程
  8. Excise_Thread2
  9. 单片机数码管显示实操
  10. Re-ID Driven Localization Refinement for Person Search