diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README.md b/solution/0000-0099/0005.Longest Palindromic Substring/README.md index 11a6b7df01a67..c6c52ab64cd4f 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README.md @@ -277,6 +277,42 @@ public class Solution { } ``` +#### C + +```c +char* longestPalindrome(char* s) { + int n = strlen(s); + bool** f = (bool**) malloc(n * sizeof(bool*)); + for (int i = 0; i < n; ++i) { + f[i] = (bool*) malloc(n * sizeof(bool)); + for (int j = 0; j < n; ++j) { + f[i][j] = true; + } + } + int k = 0, mx = 1; + for (int i = n - 2; ~i; --i) { + for (int j = i + 1; j < n; ++j) { + f[i][j] = false; + if (s[i] == s[j]) { + f[i][j] = f[i + 1][j - 1]; + if (f[i][j] && mx < j - i + 1) { + mx = j - i + 1; + k = i; + } + } + } + } + char* res = (char*) malloc((mx + 1) * sizeof(char)); + strncpy(res, s + k, mx); + res[mx] = '\0'; + for (int i = 0; i < n; ++i) { + free(f[i]); + } + free(f); + return res; +} +``` + #### Nim ```nim diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md index 4ac2610fb4e8e..e317ceda58ac4 100644 --- a/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md +++ b/solution/0000-0099/0005.Longest Palindromic Substring/README_EN.md @@ -275,6 +275,42 @@ public class Solution { } ``` +#### C + +```c +char* longestPalindrome(char* s) { + int n = strlen(s); + bool** f = (bool**) malloc(n * sizeof(bool*)); + for (int i = 0; i < n; ++i) { + f[i] = (bool*) malloc(n * sizeof(bool)); + for (int j = 0; j < n; ++j) { + f[i][j] = true; + } + } + int k = 0, mx = 1; + for (int i = n - 2; ~i; --i) { + for (int j = i + 1; j < n; ++j) { + f[i][j] = false; + if (s[i] == s[j]) { + f[i][j] = f[i + 1][j - 1]; + if (f[i][j] && mx < j - i + 1) { + mx = j - i + 1; + k = i; + } + } + } + } + char* res = (char*) malloc((mx + 1) * sizeof(char)); + strncpy(res, s + k, mx); + res[mx] = '\0'; + for (int i = 0; i < n; ++i) { + free(f[i]); + } + free(f); + return res; +} +``` + #### Nim ```nim diff --git a/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c new file mode 100644 index 0000000000000..e5a88d6c8c467 --- /dev/null +++ b/solution/0000-0099/0005.Longest Palindromic Substring/Solution.c @@ -0,0 +1,31 @@ +char* longestPalindrome(char* s) { + int n = strlen(s); + bool** f = (bool**) malloc(n * sizeof(bool*)); + for (int i = 0; i < n; ++i) { + f[i] = (bool*) malloc(n * sizeof(bool)); + for (int j = 0; j < n; ++j) { + f[i][j] = true; + } + } + int k = 0, mx = 1; + for (int i = n - 2; ~i; --i) { + for (int j = i + 1; j < n; ++j) { + f[i][j] = false; + if (s[i] == s[j]) { + f[i][j] = f[i + 1][j - 1]; + if (f[i][j] && mx < j - i + 1) { + mx = j - i + 1; + k = i; + } + } + } + } + char* res = (char*) malloc((mx + 1) * sizeof(char)); + strncpy(res, s + k, mx); + res[mx] = '\0'; + for (int i = 0; i < n; ++i) { + free(f[i]); + } + free(f); + return res; +} diff --git a/solution/0000-0099/0006.Zigzag Conversion/README.md b/solution/0000-0099/0006.Zigzag Conversion/README.md index c12bad03a22aa..ad923fc0971e8 100644 --- a/solution/0000-0099/0006.Zigzag Conversion/README.md +++ b/solution/0000-0099/0006.Zigzag Conversion/README.md @@ -282,6 +282,47 @@ public class Solution { } ``` +#### C + +```c +char* convert(char* s, int numRows) { + if (numRows == 1) { + return strdup(s); + } + + int len = strlen(s); + char** g = (char**) malloc(numRows * sizeof(char*)); + int* idx = (int*) malloc(numRows * sizeof(int)); + for (int i = 0; i < numRows; ++i) { + g[i] = (char*) malloc((len + 1) * sizeof(char)); + idx[i] = 0; + } + + int i = 0, k = -1; + for (int p = 0; p < len; ++p) { + g[i][idx[i]++] = s[p]; + if (i == 0 || i == numRows - 1) { + k = -k; + } + i += k; + } + + char* ans = (char*) malloc((len + 1) * sizeof(char)); + int pos = 0; + for (int r = 0; r < numRows; ++r) { + for (int j = 0; j < idx[r]; ++j) { + ans[pos++] = g[r][j]; + } + free(g[r]); + } + ans[pos] = '\0'; + + free(g); + free(idx); + return ans; +} +``` + @@ -491,7 +532,7 @@ class Solution { return $result; } } -``` +`` diff --git a/solution/0000-0099/0006.Zigzag Conversion/README_EN.md b/solution/0000-0099/0006.Zigzag Conversion/README_EN.md index 04390da8f24e7..a29574773c096 100644 --- a/solution/0000-0099/0006.Zigzag Conversion/README_EN.md +++ b/solution/0000-0099/0006.Zigzag Conversion/README_EN.md @@ -280,6 +280,47 @@ public class Solution { } ``` +#### C + +```c +char* convert(char* s, int numRows) { + if (numRows == 1) { + return strdup(s); + } + + int len = strlen(s); + char** g = (char**) malloc(numRows * sizeof(char*)); + int* idx = (int*) malloc(numRows * sizeof(int)); + for (int i = 0; i < numRows; ++i) { + g[i] = (char*) malloc((len + 1) * sizeof(char)); + idx[i] = 0; + } + + int i = 0, k = -1; + for (int p = 0; p < len; ++p) { + g[i][idx[i]++] = s[p]; + if (i == 0 || i == numRows - 1) { + k = -k; + } + i += k; + } + + char* ans = (char*) malloc((len + 1) * sizeof(char)); + int pos = 0; + for (int r = 0; r < numRows; ++r) { + for (int j = 0; j < idx[r]; ++j) { + ans[pos++] = g[r][j]; + } + free(g[r]); + } + ans[pos] = '\0'; + + free(g); + free(idx); + return ans; +} +``` + diff --git a/solution/0000-0099/0006.Zigzag Conversion/Solution.c b/solution/0000-0099/0006.Zigzag Conversion/Solution.c new file mode 100644 index 0000000000000..3111a73e7035c --- /dev/null +++ b/solution/0000-0099/0006.Zigzag Conversion/Solution.c @@ -0,0 +1,36 @@ +char* convert(char* s, int numRows) { + if (numRows == 1) { + return strdup(s); + } + + int len = strlen(s); + char** g = (char**) malloc(numRows * sizeof(char*)); + int* idx = (int*) malloc(numRows * sizeof(int)); + for (int i = 0; i < numRows; ++i) { + g[i] = (char*) malloc((len + 1) * sizeof(char)); + idx[i] = 0; + } + + int i = 0, k = -1; + for (int p = 0; p < len; ++p) { + g[i][idx[i]++] = s[p]; + if (i == 0 || i == numRows - 1) { + k = -k; + } + i += k; + } + + char* ans = (char*) malloc((len + 1) * sizeof(char)); + int pos = 0; + for (int r = 0; r < numRows; ++r) { + for (int j = 0; j < idx[r]; ++j) { + ans[pos++] = g[r][j]; + } + free(g[r]); + } + ans[pos] = '\0'; + + free(g); + free(idx); + return ans; +}